Antd5 Form表单输入组件
表单、表格、图像、日期选择器、下拉列表、文件选择器、容器、地图、模式、富文本编辑
- Input 文本输入框
- type=input
- type=textarea
- InputNumber 数字输入
- RichText 富文本
- AutoComplete 自动提示
- Cascader 多级联动
- ColorPIcker 颜色选择
- DatePicker 日期选择
- TimePicker 时间选择
- Upload 上传
- Select 下拉
- SelectRemote 远程获取数据
- SearchUser 搜索人员
- SearchDepartment 搜部门,支持模糊搜索
- SelectI18nRemote 多语言远程搜索
- DropdownRemote
- Enum 枚举类,传入值,显示枚举
- Checkbox 复选框
- CheckboxGroup
- CheckboxGroupRemote
- Radio 单选
- RadioGroup 多个单选
- RadioGroupRemote
- Rate 评分
- Switch 开关
- Slider 滑块
- Tree 树形
- isLeaf: true, 有叶子节点(children子组件)
时间组件
时间
日期
时间日期
日期范围选择
省市区组件
省市区三级联动
省市区勾选
地图经纬度选择器
文件上传
单文件上传
多文件上传
多文本编辑框
富文本编辑器
RichText富文本输入框
Markdown输入框
二维码生成
Curl
IP 地址转地区
单图上传
多图上传
图片裁剪上传
颜色选择器
受控组件
value 的值类型
onChange参数的值
value就是值InputNumberSelecte.target.checkedCheckBoxRadioGroupInput
form属性
- labelCol:指定label的 col宽度
- wrapCol:指定表单输入控件的 col宽度
- span跨距
- col应该是column的缩写,表示列
- wrapper包装器
offset是表示偏移量,一个东西相对另一个的距离
<Form>
Form.item
- 同名表单项的值共享,并且其中一个的值改变,另外的同名表单的值也一致改变
- 同名的表单被当成完全相同的表单项处理,数值和onChange行为都一样,两个表单项的onChange始终只执行了最后一个表单项的onChange事件
- 动态新增表单会出现表单同名的问题
- FormItem中 name的唯一性
- 要想得到正确的结果,应该分别分别修改两个表单中的域名
- 装饰器语法 https://segmentfault.com/p/1210000009968000/read ```jsx import React, { PureComponent } from ‘react’ import { Form, Input } from ‘antd’ import styles from ‘./styles.less’
@Form.create() // 装饰器语法 class Example extends PureComponent {
renderItem = ({item, index}) => { return (
list.${index}.name)(
)}
render() { const {data} = this.props return (
) } }
<a name="9kC7P"></a>### textarea```jsx<Input.Textareaplaceholder=""cols=""rows=""maxlength=""minlength=""name="textarea"/>// csstextarea {resize: none; // 禁止拖拽}
表单布局可以错落有致
表单宽度的处理方式核心旨在解决两个问题
- 暗示填写内容长度;
- 表单项布局排列效果,通过设置合理的默认宽度尺码和描述关系
- input 所需填写内容都存在理想长度
- XS - 80~160px、S - 160~280、M - 280~360px、L - 360px~480px、XL - 480~560px。
- 让组合 input 和单个 input 对齐概率最大化
react表单可视化
https://blog.csdn.net/weixin_39652154/article/details/111618031
https://github.com/blackjk3/react-form-builder
https://github.com/dog-days/antd-react-form-builder
form4.x
Form 不再需要通过 Form.create() 创建上下文。
Form 组件现在自带数据域,因而 getFieldDecorator 也不再需要,直接写入 Form.Item 即可:
onFieldsChange 等方法移入 Form 中,通过 fields 对 Form 进行控制。
调用 form 方法,可以通过 Form.useForm() 创建 Form 实体进行操作
resetFields 是重置回 initialValues 的值,并且 initialValues 只用于第一次初始化,不响应后续的变化initialValue 只能作为组件初次挂载的时候生效。
让 Form 随着组件的销毁一起销毁, 这样每次就都是新的了
antd-4x.form.js
const Demo = () => {const [form] = Form.useForm();useEffect(() => {// 初始化的默认数据form.setFieldsValue({username: 'Bamboo',});}, []);function onFinish() {}return (<Formform={form}initialValues={{name: record ? record.name : 1}}onFinish={onFinish}><Form.Itemlabel="用户"name="username" rules={[{ required: true }]}><Input /></Form.Item></Form>)};
form3.x
getFieldDecorator
Form.create
getFieldDecorator 被当成 props 传值
【备注】4.0 不需要 getFieldDecorator 和 Form.create 这两个方法
Form.create
经 Form.create() 包装过的组件会自带 this.props.form 属性
但initialValue属性必须设置在getFieldDecorator()
Form 将默认聚合表单数据域,你不再需要通过 Form.create() 创建上下文。
Fom.Item 将默认聚合表单字段,你不需要通过 getFieldDecorator 绑定 Field。
Form.Item 的值将总会保留,但是其验证功能只有表单项可见时才会生效
使用 Form.create 处理后的表单具有自动收集数据并校验的功能,但如果您不需要这个功能,或者默认的行为无法满足业务需求,可以选择不使用 Form.create 并自行处理数据。
class ListForm extends React.Component {}// ListForm = Form.create({})(ListForm) 默认导出的是 Form.create()()export default Form.create({})(ListForm)// antd v3const ListFrom = props => {const { getFieldDecorator, setFieldsValue } = props.formuseEffect(() => {setFieldsValue({username: 'Bamboo',});}, []);return (<Form><Form.Item>{getFieldDecorator('username', {rules: [{ required: true }],})(<Input />)}</Form.Item></Form>)}export default Form.create({})(ListFrom);
form常见错误
antd Switch 报错:[antd: Switch] _value_ is not validate prop, do you mean _checked_?
<FormItem label="开关">{getFieldDecorator('switch', {valuePropName: 'checked'})(<Switch onChange={this.onChange} />)}</FormItem>
Warning: _getFieldDecorator_ will override _value_, so please don’t set _value_ directly and use _setFieldsValue_ to set it.
- 用 Form.create()() HOC,可以从 props中获取到
form.getFieldDecorator - 不能使用 value,要用 initialValue
setFieldsValue
You cannot set a form field before rendering a field associated with the value.
直译了下warning描述,说是关联的field渲染前,用set给form的field赋值
怎么解决呢
1、在form组件显示出后,再用this.form.setFieldsValue
2、在this.$nextTick()中使用this.form.setFieldsValue
3、如果要表单绑定的数据和属性不匹配也会出现这个问题
- 在使用this.form.setFieldsValue时,赋值的数据要一一匹配field
- 用不到的不要赋值即可,这样操作之后错误提示就不再提醒了
setFieldsValue的字段要对应得上
在使用setFieldsValue给表单Form的某一个filed赋值时,可能掺杂了非表单控件中的字段,
Form表单在赋值和渲染时发现有些字段无法渲染在现有的字段(因为不存在),所以就会报出这样的错误提示
this.props.form.form.setFieldsValue 传值的时候只能是form中用到的参数(即是getFieldDecorator方法中的field)没有的field一律不允许多传,否则就会报错
原因:多传递了多余的字段,自己数数和测测,看看是否传递了没有的字段
