当前位置: 首页 > news >正文

Antd中Form详解:

1.获取Form表单值的方式:

   ① 使用Form.useForm()钩子(推荐方式)
 const [form] = Form.useForm();const getFormValues = () => {const values = form.getFieldsValue();};<Form form={form}>...<Form.Item  label={null}><Button onClick={getFormValues}>获取值</Button></Form.Item>  </Form>
   ② 类组件中使用ref
class MyForm extends React.Component {formRef = React.createRef();getFormValues = () => {const values = this.formRef.current.getFieldsValue();};render() {return (<Form ref={this.formRef}>...<Form.Item label={null}><Button onClick={this.getFormValues}>获取值</Button></Form.Item></Form>);}
}
   ③ 通过onFinish回调获取
<Form onFinish={(values) => console.log(values)}>...
</Form>

2.Form.useForm和React.createRef的区别:

   ① 适用范围不同:

      useForm是React Hook的实现,只能用于函数组件

      createRef用来声明一个ref,可以在类组件中使用

   ② 获取表单值的方式不同:

      useForm : form.getFieldsValue()

      createRef : this.formRef.current.getFieldsValue()

3.Form.Item绑定两个值:

嵌套两层<Form.Item>,第一层无需绑定name属性,第二层绑定name,并设置样式display: "inline-block",让两个<Form.Item>在一行显示,如图所示

//在表单值中会得到:{orgCreditor: "123",orgCreditorShow: true}<Form.Item<FieldType> label="委托方"><Form.Item name="consignor" style={{ display: "inline-block", width: "50%"}}><Input /></Form.Item><Form.Item name="consignorShow" valuePropName="checked" style={{ display: "inline- block", width: "50%" }}><Checkbox>简称不显示在资产名称中</Checkbox></Form.Item>
</Form.Item>

4.Form.Item绑定嵌套对象:

当 name 为数组时,会按照顺序填充路径。

<Form.Item name={["debtInfo", "name"]} label="债务人全称"><Input />
</Form.Item>获取到的表单值 : debtInfo={name:"张三"}回显赋值 :
方式一 : const debtInfo={name:"张三"}form.setFieldValue("debtInfo",debtInfo)方式二 : form.setFieldValue(["debtInfo","name"],"张三")

5.Form表单校验:

通过配置validateMessages自定义校验信息模板:

注:<1>输入框input/textArea应该加校验时机validateTrigger="onBlur",否则每输一次校验一次;

  <2>scrollToFirstError提交失败自动滚动到第一个错误字段;

//自定义校验信息模板
const validateMessages = {required: "${label}不能为空"
};<Form ... validateMessages={validateMessages}><Form.Item<FieldType> label="机构" name="tenantId" rules={[{ required: true }]}>...</Form.Item>
</Form>

②直接在<Form.Item>上定义rules校验规则:

<Form.Item<FieldType> label="机构"validateTrigger="onBlur" name="tenantId" rules={[{ required: true ,message:"机构不能为空"}]}><Input/>									
</Form.Item>

6.Form常用API:

方法参数/返回值说明

form.setFieldsValue

(values: object) => void

设置表单的值(该值将直接传入 form store 中并且重置错误信息。如果你不希望传入对象被修改,请克隆后传入)。(不会触发校验)。

form.setFieldValue

(name:string,value:any ) => void

设置表单的值(该值将直接传入 form store 中并且重置错误信息。如果你不希望传入对象被修改,请克隆后传入)

form.getFieldsValue

(nameList?: string[]) => object

获取一组字段名对应的值,会按照对应结构返回。默认返回现存字段值,当调用 getFieldsValue(true) 时返回所有值

form.getFieldValue

(name: string) => any

获取对应字段名的值

form.validateFields

() => Promise<values>

校验表单并返回所有字段值(校验失败会 reject)。

form.resetFields

(fields?: string[]) => void

重置字段值(默认重置所有,可指定字段名)。

form.setFields

(fields: FieldData[]) => voidstring

设置一组字段状态(如错误提示:{ name: 'field', errors: ['报错'] })。

form.getFieldsError

(nameList?: string[]) => FieldError[]

获取一组字段名对应的错误信息,返回为数组形式

form.isFieldsTouched

(nameList?: string[],allTouched?:boolean) => boolean

检查一组字段是否被用户操作过,allTouched 为 true 时检查是否所有字段都被操作过

7.InputNumber常用属性:

controls : 是否显示增减按钮

precision : 数值精度,限制小数位数

max : 设置最大值(包含)

min : 设置最小值(包含),若最小值为0,则不允许输入负数

<Form.Item name="payment" label="已垫付律师费"><InputNumber controls={false} precision={2} max={200} min={0} />
</Form.Item>

8.select绑定对象:

在Select组件中添加labelInValue 属性,可以拿到选中节点的 label和value

<Form.Item<FieldType> label="选择资产包" name="packageData"><Select labelInValue options={packageList} fieldNames={{ label: "code", value: "id" }}></Select>
</Form.Item>//获取到的值是 packageData:{key: 492,label:"1122222",value:492}

9.Form.Item的valuePropName属性:

Switch、Checkbox 的 valuePropName 应该是 checked,否则无法获取这个两个组件的值。

<Form.Item name="consignorShow" valuePropName="checked" ><Checkbox>简称不显示在资产名称中</Checkbox>
</Form.Item>

10.Cascader联级选择器的使用:

   fieldNames:自定义 options 中 label,value,children 的字段

   showSearch:在选择框中显示搜索框,支持模糊搜索

   displayRender:选择后展示的渲染函数(不能在渲染过程中直接调用 setState,否则会报错)

import type { CascaderProps, GetProp } from "antd";
type DefaultOptionType = GetProp<CascaderProps, "options">[number];//联级选择器选项
const options = [{id: 110000,name: "北京",children: [{id: 110100,name: "北京市",children: [{children: [],id: 110101,name: "东城区"},{children: [], id: 110102, name: "西城区" }]}]}];//联级选择器模糊搜索
const filter = (inputValue: string, path: DefaultOptionType[]) =>path.some(option => (option.name as string).toLowerCase().indexOf(inputValue.toLowerCase()) > -1);const displayRender = (labels: string[]) => {// labels 就是选中的 label 数组return labels.join(" / ")
};<Form.Item name="creditorArea" label="所在地"><CascaderexpandTrigger="hover"fieldNames={{ label: "name", value: "id", children: "children" }}options={options}placeholder="请选择"showSearch={{ filter }}displayRender={displayRender}allowClear/>
</Form.Item>

11.DatePicker或RangePicker日期格式化:

使用 Form.Item 的 getValueFromEvent 和 getValueProps进行格式化:

import moment from 'moment';<Form.Itemname="tradingBenchmarkDate"label="违约基准日"getValueFromEvent={value => (value ? moment(value).format("YYYY-MM-DD") : null)}getValueProps={value => ({ value: value ? moment(value, "YYYY-MM-DD") : null })}
><DatePicker format="YYYY-MM-DD" />
</Form.Item><Form.Itemname="dateRange"label="日期范围"getValueFromEvent={(dates) => dates ? dates.map(date => moment(date).format('YYYY-MM-DD')) : null}getValueProps={(value) => ({value: value ? value.map(date => moment(date, 'YYYY-MM-DD')) : null})}
><RangePicker format="YYYY-MM-DD" />
</Form.Item>

相关文章:

  • volatile是什么
  • # YOLOv3:基于 PyTorch 的目标检测模型实现
  • RevIN(Reversible Instance Normalization)及其在时间序列中的应用
  • 软件测试服务公司分享:国产化适配测试的重要性和关键要素
  • paimon中批和流查看过去的快照的数据及变动的数据
  • OSCP备战-Kioptrix4详细教程
  • Python+1688 API 开发教程:实现商品实时数据采集的完整接入方案
  • Conda在powershell终端中无法使用conda activate命令
  • React百日学习计划-Grok3
  • 如何学习VBA_3.3.3 VBA程序写好后,如何进行调试,直到程序运行
  • 数据结构—(链表,栈,队列,树)
  • 重生之我是CSDN大佬
  • 在VirtualBox中安装虚拟机后不能全屏显示的问题及解决办法
  • 从零实现一个高并发内存池 - 1
  • [ctfshow web入门] web72
  • Linux精确列出非法 UTF-8 字符的路径或文件名
  • logback 日志归档,解决主日志和归档日志分别定义不同的周期
  • EXCEL Python 实现绘制柱状线型组合图和树状图(包含数据透视表)
  • Redis Cluster 集群搭建和集成使用的详细步骤示例
  • 获取accesstoken时,提示证书解析有问题,导致无法正常获取token
  • 国台办:80年前台湾重归中国版图,80年后不可能让台湾分裂出去
  • 足球少年郎7月试锋芒,明日之星冠军杯构建顶级青少年赛事
  • 中国创面修复学科发起者之一陆树良教授病逝,享年64岁
  • 学者的“好运气”:读本尼迪克特·安德森《椰壳碗外的人生》
  • 山西省委常委李金科添新职
  • 盖茨说对中国技术封锁起到反作用