antd中的表单的使用

每天对自己多问几个为什么,总是有着想象不到的收获。 一个菜鸟小白的成长之路(copyer)

前言

​ 在开发项目中,经常使用表单模块,来完成交互的过程。但是我感觉,在以前开发的过程中,就是直接copy,没有仔细的去理解其中的逻辑,只要现象满足就可以。但是最近项目中想封装一个通用的表单组件,还是必要知道其中的逻辑和各个属性。所以,就回头过来仔细的理一下。


使用

antd4中,使用form表单,有着三种不同的方式的写法。

  • 普通用法 (所以的布局全在表单中)
  • hooks写法 (主要是针对函数式组件,外面的按钮可以触发表单的中的事件)
  • class写法 (跟hooks的思路是一样的,不过它是通过ref来获取的)

这里就主要理一下前面的两种写法。


1、普通的写法
 const onFinish = (values) => {
     // 点击提交按钮,拿到表单中的数据 
     console.log(values);
 }


<Form
    name="basic"
    labelCol={{ span: 9 }}
    wrapperCol={{ span: 15 }}
    initialValues={{ username: 'james' }}
    onFinish={onFinish}
 	onValuesChange={onValuesChange}
    layout="inline"
>
    <Form.Item
        label="username"
        name="username"
        rules={[{ required: true, message: 'Please input your username!' }]}
     >
    	<Input />
    </Form.Item>
    <Form.Item>
        <Button type="primary" htmlType="submit">确定</Button>
    </Form.Item>
</Form>

写法优点: 简便,可读性强

写法缺点: 所有的东西都写在Form里面,外面的逻辑不能操作。提交按钮,还需要写上htmlType="submit",还必须被Form.Item包裹。


2、hook写法
export default function StudyForm() {
	//使用antd4中的提供的hooks
    const [ form ] = Form.useForm()

    const onFinish = (values) => {
        console.log(values);
    }
    const onClick = () => {
        // 外面的结构调用表单内部的方法,然后出发onFinish
        form.submit()
    }

    return (
        <>
            <Form
            name="basic"
            form={form}    // 注册
            labelCol={{ span: 9 }}
            wrapperCol={{ span: 15 }}
            initialValues={{ username: 'james' }}
            onFinish={onFinish}
            layout="inline"
            >
                <Form.Item
                    label="username"
                    name="username"
                    colon
                    rules={[{ required: true, message: 'Please input your username!' }]}
                >
                    <Input />
                </Form.Item>
            </Form>
            <Button type="primary" onClick={onClick}>确定</Button>
         </>
    );
}

写法优点:写法更加的灵活,扩展性更强

写法缺点: 需要对form提供的API有所认知


Form实例提供的API
名称说明类型
getFieldError获取对应字段名的错误信息(name: NamePath) => string[]
getFieldInstance获取对应字段实例(name: NamePath) => any
getFieldsError获取一组字段名对应的错误信息,返回为数组形式(nameList?: NamePath[]) => FieldError[]
getFieldsValue获取一组字段名对应的值,会按照对应结构返回。默认返回现存字段值,当调用 getFieldsValue(true) 时返回所有值(nameList?: NamePath[], filterFunc?: (meta: { touched: boolean, validating: boolean }) => boolean) => any
getFieldValue获取对应字段名的值(name: NamePath) => any
isFieldsTouched检查一组字段是否被用户操作过,allTouchedtrue 时检查是否所有字段都被操作过(nameList?: NamePath[], allTouched?: boolean) => boolean
isFieldTouched检查对应字段是否被用户操作过(name: NamePath) => boolean
isFieldValidating检查对应字段是否正在校验(name: NamePath) => boolean
resetFields重置一组字段到 initialValues(fields?: FieldData[]) => void
scrollToField滚动到对应字段位置(name: NamePath, options: [ScrollOptions]) => void
setFields设置一组字段状态(fields: FieldData[]) => void
setFieldsValue设置表单的值(values) => void
submit提交表单,与点击 submit 按钮效果相同() => void
validateFields触发表单验证(nameList?: NamePath[]) => Promise

属性解释

Form

1、props

labelCol、wrapperCol 是用来对表单进行布局,跟Col的用法是一致的

initialValues 使用用来初始化表单数据的(只在初始化,或者重置的时候生效)

layout 表单布局 (垂直、水平)

2、方法

onFinish 点击提交按钮时,触发

onValuesChange 改变表单中的数据,就触发(主要通知父组件做出改变)

Form.Item

props

name 给表单每项取个名字,通过该字段拿取数据

rules 验证规则

当然属性还有很多,需要用的时候再去查看文档就行了


总结

​ 总的来说,对表单的写法有着基本的认识,不会像以前那么的迷茫了,在未来也有更加的熟悉hooks的写法。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值