使用ant-desigin-vue中form表单遇到的坑总结

 一、form.validateFields() 不执行

问题:

提价表单时,发现验证不通过时正常提醒,但验证通过后点击提交又没反应。最后发现是因为validateFields函数没被执行,通过一步步排查原来是字段验证的部分有问题。

const validateCode = (rule, value, callback) => {
	if (value == '') {
		callback(new Error('请输入字典编号'));
	} 
    else if(!/^[A-z0-9-_]+$/.test(value)){
		callback(new Error('请输入正确格式编号'));
	}
	else if(value.length>32){
		callback(new Error('最大长度为 32 个字符'));
	}
};

 上面的代码中,在字典编号格式验证通过后,没有写else,没有任何动作,当然也没有调用callback 。可是在 antd 中明确写到自定义校验(注意,callback 必须被调用) ,所以造成了悲剧。

 既然问题找到了,哪就好解决了,接下来加入else判断即可:

const validateCode = (rule, value, callback) => {
  if (value == '') {
    callback(new Error('请输入字典编号'));
  } 
  else if(!/^[A-z0-9-_]+$/.test(value)){
    callback(new Error('请输入正确格式编号'));
  }
  else if(value.length>32){
    callback(new Error('最大长度为 32 个字符'));
  }
  else{
    callback()
  }
};

正好我的同事也遇到了相似的问题,我想着小露一手的时候到了。不出意外的话...意外就出现了。

 先看一下代码:

validatePhone(rule, value, callback) {
      if (!value) {
        callback()
      } else {
        if (new RegExp(/^1[3|4|5|7|8][0-9]\d{8}$/).test(value)) {
          var params = {
            tableName: 'sys_user',
            fieldName: 'phone',
            fieldVal: value,
            dataId: this.userId
          }
          duplicateCheck(params).then(res => {
            if (res.success) {
              callback()
            } else {
              callback('手机号已存在!')
            }
          })
        } else {
          callback('请输入正确格式的手机号码!')
        }
      }
    }

咋一看没问题吧,每一个判断下都有回调函数callback。离谱的是最后找了个把小时才发现原来是if判断里有一个请求API(duplicateCheck)没有引入,关键是还没有任何报错提示。

总结:

  • 检查每一个判断里是否调用了callback函数
  • 如果判断里发送了请求,一定记得提前引入API

二、表单验证 async-validator: ['xxx is not a string']

题:

在方法校验的时候,会有一部分非 String 类型表单项提示校验未通过,console中显示 async-validator: ["xxx is not a string"]。

解决:

  • 去掉 :rules 规则中的 trigger 属性即可;
  • 如果是验证数字格式的,就设为type: 'number’。如:
Money: { rules: [{ required: true, type: 'number', message: '请输入金额!', trigger: 'change' }] },

要在 ant-design-vue 提交一个表单,您可以使用 `Form` 组件和 `Form.Item` 组件。以下是一个简单的示例: ```html <template> <a-form ref="form" :model="formData" :rules="formRules" @submit="handleSubmit"> <a-form-item label="Name" :colon="false" prop="name"> <a-input v-model="formData.name" /> </a-form-item> <a-form-item label="Email" :colon="false" prop="email"> <a-input v-model="formData.email" /> </a-form-item> <a-form-item> <a-button type="primary" html-type="submit">Submit</a-button> </a-form-item> </a-form> </template> <script> export default { data() { return { formData: { name: '', email: '', }, formRules: { name: [{ required: true, message: 'Please enter your name', trigger: 'blur' }], email: [ { required: true, message: 'Please enter your email', trigger: 'blur' }, { type: 'email', message: 'Please enter a valid email address', trigger: 'blur' }, ], }, }; }, methods: { handleSubmit() { this.$refs.form.validate(valid => { if (valid) { // Submit the form data console.log(this.formData); } else { console.log('Form validation failed'); return false; } }); }, }, }; </script> ``` 在上面的代码,我们首先创建了一个 `Form` 组件,并将其绑定到 `formData` 数据属性和 `formRules` 数据属性。然后,我们在表单添加了两个 `Form.Item` 组件,分别用于输入名称和电子邮件地址。最后,我们添加了一个提交按钮,并将其绑定到 `handleSubmit` 方法。 在 `handleSubmit` 方法,我们首先使用 `this.$refs.form.validate` 方法验证表单数据。如果表单数据有效,则提交表单数据,否则输出一个错误消息。 请注意,我们在 `a-button` 组件上使用 `html-type="submit"` 属性来指定按钮类型为提交按钮。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值