在使用 antd 的表单过程中,发现存在许多的问题。该博客会对我曾经遇到过的问题做一个总结,由于内容太多,所以预计会分成 3 篇。
这是该主题的第一篇,主要介绍「什么是自定义表单」。全文会以「简历表单」作为示例来进行说明。
一、示例说明
现在需要一个「简历」表单,支持填写个人信息、工作经历和项目经历。
1、字段
基本信息包含 7 个字段,需要提交的数据格式如下:
1 | { |
2、校验规则
对于字段会有一些校验要求
- 姓名必填
- 性别必填
- 城市必填
- 邮箱必填,并且符合邮箱格式
- 工作经历选填
- 项目经历选填,但如果增加了项目经历,项目名、项目类型必填
二、最简单的实现代码
完成这么一个表单是非常简单的,300 行左右代码即可完成,
1 | import React from 'react'; |
也可访问线上示例「示例基础实现代码」。虽然代码行数不多,但仍有许多优化空间,这也是本文的主题,拆分为多个自定义表单。
三、预期的简历表单组件
既然是封装为表单组件,那么在使用上应该和现有的表单组件相同,支持直接使用,也支持配合Form
组件使用。
1 | @Form.create() |
而ResumeForm
也不是简单地将原先代码拷贝过来,而是同样做一些拆分,代码如下:
1 | export default class ResumeForm extends React.Component { |
1、拆分组件为细粒度的表单有什么好处
- 1、
ResumeForm
组件可复用,只需引入即可,而不是复制粘贴代码。 - 2、代码整洁,原先的 300 余行代码现在变成了 20 行。
- 3、语义、职责更加清晰,首页由一个「表单」和一个「按钮」组成,表单负责提供数据,页面组件不再像之前一样掺杂了许多无关的代码。
第二、三点从ResumeForm
代码可以很直观看到,从原先的一个大整体,变成了三个子组件,每个子组件只负责一部分数据。
而再深入到BasicInfoForm
组件中
1 | export default class BasicInfoForm extends React.PureComponent { |
除了使用antd
提供的基础表单组件外,还自己声明了SexSelect
、CitySelect
和EmailInput
组件,这类组件只是简单对原有基础表单组件做了一层封装,但还是可以配合getFieldDecorator
使用。
2、自定义表单组件的说明
上面提到的ResumeForm
、BasicInfoForm
以及这里的SexSelect
,都是对原有组件进行「组合」或「封装」得到的,能够直接使用,也可以配合Form
组件使用的组件,就是我想要描述的「自定义表单组件」。
四、下期预告
接下来会先对「基本信息表单」做详细的讲解,主要会涉及到
- 怎么衡量是否要作为自定义表单组件
- 自定义表单的写法
- 取值的问题
- 校验的问题
antd 自定义表单的问题 - 2