antd中的Form、FormItem、FormList、FormList + Table详解

Form是高性能表单控件,自带数据域管理。包含数据录入、校验以及对应样式。

一、Form

1、初始化

// 实例初始化
type Form.useForm = (): [FormInstance] // FormInstance是Form实例,相当于一个hooks
const [form] = Form.useForm();

// 初始化值;
const initialValues = {
   
        name: 'zhangsan',
        age: '19',
    }
// render
<Form form={
   form} initialValues={
   initialValues}></Form>

initialValues:注意值只会初始化的时候生效,后续修改initialValues或者setState不会让表单显示最新数据;修改值使用form.setFieldsValue

2、监听字段并且响应式

// name字段值被修改,会触发组件更新(nameState所在的组件)
const nameState = Form.useWatch('name', form) 

form.setFieldsValue会更新form组件实例,但是不会更新父组件;useWatch可以触发父组件更新

3、常用属性

labelCol、wrapperCol、onFieldsChange、onFinish、onFinishFailed、onValuesChange

// labelCol、wrapperCol
const labelCol = {
   
	span: 8, // label占用格数,24分制;
}
const wrapperCol = {
   
	span: 8, // content占用格数,24分制;
	offset: 8, // 左侧的间隔格数;当你有一个Item不想展示label,又想对齐,可以使用
}
// onFieldsChange 修改字段触发
onFieldsChange:function(changedFields, allFields)
字段修改会触发三次,值修改,校验规则中,校验结束
Trigger value change
Rule validating
Rule validated

// onFinish 表单事件提交以后并校验成功回调
Form中需要配合htmlType='submit'原生属性触发
<Button type='primary' htmlType='submit' >Submit</Button>
// onFinishFailed 表单事件提交以后并校验失败回调

// onValuesChange 修改字段触发
function(changedValues, allValues) // changedValues是修改的那一个字段,allValues是所有数据

4、实例属性

  • getFieldsValue、getFieldValue、setFieldsValue、setFieldValue、resetFields、validateFields、submit
  • getFieldsValue只会获取值存在的字段,如果所有值都没有填写,返回空对象;onValuesChange、validateFields会返回所有字段的数据对象,如果字段没有填写,字段值为undefined
// getFieldsValue
// 获取所有已经渲染的字段的值
const formValues = form.getFieldsValue(); 
// true 表示获取所有值,包括setFieldsValue所有的值(有时候数据回显,设置了多余数据)
const formValues = form.getFieldsValue(true); 

// getFieldValue 获取单个字段属性值,
// 获取数据function:((form: FormInstance) => RuleConfig)
// getFieldValue常在FormItem的function获取数据时使用

// setFieldsValue
form.setFieldsValue() // 设置表单值,key对应值的覆盖;可以设置多个字段值
setFieldsValue({
    [key]: 'newValue' })

// setFieldValue: (name: NamePath, value: any) => void
单个字段值设置
type NamePath = string | number | (string | number)[]
setFieldValue('name', 'name');
setFieldValue(9, 'name'); // 注意数字和字符串是区分的
setFieldValue(['listName', 0, 'name'], 'name'); // 修改Form.List 中单项值比较方便

// form.resetFields() 会让表单回到初始状态; 会导致父组件更新(Form实例初始化的那个组件)

// form.validateFields() 表单全部校验
// form.validateFields([NamePath]) 部分校验
// form.validateFields(['name', 'age', 9]) 校验多个字段
// 配置Promise trycatch 避免报错(有一些error会被埋点捕获,尽量使用trycatch )
const onSubmit = async(values) => {
   
    try {
   
        const res = await form.validateFields()
        console.log('validateFields success', res)
    } catch (error) {
   
        console.log('validateFields error', error)
    }
}

// form.submit()  // 与点击 submit 按钮效果相同(htmlType='submit')

简要例子

const Case = () => {
   
    const [form] = Form.useForm();
    const name = Form.useWatch('name', form)
    const initialValues = {
   
        name: 'zhangsan',
        age: '19',
    }
    const onSubmit = async (values) => {
   
	    try {
   
	        const res = await form.validateFields()
	        console.log('validateFields success', res)
	    } catch (error) {
   
	        console.log('validateFields error', error)
	    }
	}
    return (
        <>
            <Button>{
   name}</Button>
            <Form
	            form={
   form}
	            initialValues={
   initialValues}
            	labelCol={
   {
    span: 6 }}
            	wrapperCol={
   {
    span: 14 }}
            >
                <Form.Item name='name' label='name'><Input /></Form.Item>
                <Form.Item name='age' label='age'><Input /></Form.Item>
                <Form.Item wrapperCol={
   {
    offset: 6, span: 14 }}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值