Form组件自定义校验规则和多子项联合校验

antd Form组件自定义校验规则以及form.item中多个输入元素的联合校验


antd 中的form组件提供了强大的数据校验和表单数据获取的功能,但是在面对各种场景下的需求,我们如何灵活运用antd组件库提供的各种方法来实现自己的需求,却是件困难的事情。
本文通过对表单项中包含多选和输入框两个输入介质的场景来介绍,antd的自定义校验规则、元素联合校验以及自己控制提示信息的展示的应用方式。

在这里插入图片描述

自定义校验规则

  1. form.Item可以通过rule字段配置校验规则,常规用法:
// 设置为必填
<Form.Item
    label="邮箱"
    name="email"
    rules={[ { required: true, message: '请输入邮箱' }]}
>
	<input name="email" />
</Form.Item>

// 使用正则来校验
<Form.Item
    label="邮箱"
    name="email"
    rules={[ { pattern: /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/, message: '请输入邮箱' }]}
>
	<input name="email" />
</Form.Item>
  1. 使用validator函数来自定义校验规则,自定义方法返回一个promise对象,校验失败抛出提示信息
 <Form.Item name='typeInput' rules={[{
   	validator: onCheckType
   	}]}>
    <Row>
      <span className="tips">其他: </span>
      <input className={style['service-type']} maxLength={20} />
	</Row>
</Form.Item>
const [checkedList, setCheckedList] = useState<CheckboxValueType[]>([])
const onCheckType = (rule: any, value: string) => {
    return new Promise((resolve, reject) => {
      if (value) {
        resolve('');
      } else {
        if (checkedList.length === 0) {
          reject(new Error('请选择你的爱好'));
        }
        resolve('');
      }
    })
  }

表单项联合校验

使用form.validateFields()方法来实现校验规则联合调用,使用场景对表单里的所有输入都做响应式校验,一个输入所有都触发检验。

const [form] = Form.useForm()
const hobbyType = [{
	key: 'lanqiu',
	name: '篮球'
},
{
	key: 'wudao',
	name: '舞蹈'
},
{
	key: 'huaban',
	name: '滑板'
}
]
const [checkedList, setCheckedList] = useState<CheckboxValueType[]>([])
const onCheckType = (rule: any, value: string) => {
    return new Promise((resolve, reject) => {
      if (value) {
        resolve('');
      } else {
        if (checkedList.length === 0) {
          reject(new Error('请选择你的爱好'));
        }
        resolve('');
      }
    })
}
const onChange = (list: CheckboxValueType[]) => {
    setCheckedList(list);
    // 调用name为typeInput的Form.Item的校验规则
    form.validateFields(["typeInput"]);
}

<Form
  name="form"
  form={form}
>
  <Form.Item
     label="请填写你的爱好"
     required
  >
    <Checkbox.Group style={{ display: 'block' }} value={checkedList} onChange={onChange}>
        {
         hobbyType.map((hobby) => {
            return (
               <Row key={hobby.key}>
                   <Checkbox
                     value={hobby.key}
                     style={{
                         lineHeight: '32px',
                      }}
                     >
                        {hobby.name}
                     </Checkbox>
                 </Row>)})}
    </Checkbox.Group>
    <Form.Item name='typeInput' rules={[{
       validator: onCheckType
    }]}>
       		<Row>
         		<span className="tips">其他: </span>
          		<input maxLength={20} />
        	</Row>
		</Form.Item>
	</Form.Item>
</Form>

自定义校验的时机和内容

对validateStatus、help的使用

注意
这两个熟悉可以控制校验信息的状态改变,但是不会有校验拦截的实际作用
即使设置validateStatus为success也会显示help的值

 <Form.Item
      label="Validating"
      hasFeedback
      validateStatus="error"
      help="The information is being validated..."
 >
     <Input placeholder="I'm the content is being validated" id="validating" />
 </Form.Item>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在父组件校验多个子组件的表单,可以采用以下步骤: 1. 在父组件中引入 `Form` 组件,并设置 `ref` 属性 ```vue <template> <div> <form ref="form"> <child-form-1></child-form-1> <child-form-2></child-form-2> <el-button @click="submitForm">提交</el-button> </form> </div> </template> <script> import ChildForm1 from './ChildForm1.vue'; import ChildForm2 from './ChildForm2.vue'; export default { components: { ChildForm1, ChildForm2, }, methods: { submitForm() { this.$refs.form.validate(valid => { if (valid) { console.log('校验成功'); } else { console.log('校验失败'); } }); }, }, }; </script> ``` 2. 在子组件中分别引入 `FormItem` 和 `el-form-item` 组件,并设置 `prop` 属性 ```vue <template> <div> <el-form-item label="姓名" :rules="nameRules"> <el-input v-model="name"></el-input> </el-form-item> <el-form-item label="年龄" :rules="ageRules"> <el-input v-model="age"></el-input> </el-form-item> </div> </template> <script> export default { data() { return { name: '', age: '', nameRules: [ { required: true, message: '请输入姓名', trigger: 'blur' }, ], ageRules: [ { required: true, message: '请输入年龄', trigger: 'blur' }, { type: 'number', message: '请输入数字', trigger: 'blur' }, ], }; }, props: { prop: String, }, }; </script> ``` 3. 在父组件中使用 `$children` 获取所有子组件,并遍历执行表单校验 ```vue <template> <div> <form ref="form"> <child-form-1 ref="form1"></child-form-1> <child-form-2 ref="form2"></child-form-2> <el-button @click="submitForm">提交</el-button> </form> </div> </template> <script> import ChildForm1 from './ChildForm1.vue'; import ChildForm2 from './ChildForm2.vue'; export default { components: { ChildForm1, ChildForm2, }, methods: { submitForm() { let valid = true; this.$children.forEach(child => { if (child.$refs[child.prop]) { child.$refs[child.prop].validate(valid => { if (!valid) { valid = false; } }); } }); if (valid) { console.log('校验成功'); } else { console.log('校验失败'); } }, }, }; </script> ``` 在这个例子中,我们通过 `$children` 获取所有子组件,并使用 `child.$refs[child.prop]` 获取到子组件中的 `el-form-item`,然后执行 `validate` 方法进行校验。如果校验失败,将 `valid` 设置为 `false`,最终判断 `valid` 是否为 `true` 来判断所有表单校验是否成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值