Ant for Vue Modal 里的 Form 校验

误区

​ ant for vue 的 Modal 自带确认和关闭按钮,如果在 modal 里面加上 slot=“footer” 的底部按钮会覆盖原本 modal 自带的按钮,使 form 的校验不生效!!!

注意

<a-form :form="form"> 的 form 属性不能少

实现代码

<!--    對話框    -->
 <a-modal
    :visible.sync="visible" //是否显示对话框
    :title="textMap[modalType]"
    ok-text="确认" 
    :cancel-text="$t('cancel')" //按钮国际化
    @ok="handleSubmit" // 对话框提交按钮
    @cancel="visible = false"  //对话框的取消按钮
    :closable="false" //不显示对话框的x按钮
>
        <a-form :model="tempData" v-bind="layout" :form="form">
          <a-form-item label="名称">
            <a-input name="name" v-decorator="['name', rules.name]" />
          </a-form-item>
        <a-form-item label="详情">
            <a-input type="textarea" name="description" v-decorator="['description', rules.description]" />
        </a-form-item>
       </a-form>
</a-modal>

export default {
    name: 'user',
    components: {},
    data () {
      return {
          tempData: {
              name: '',
              description: ''
          },
          modalType: '',
          form: this.$form.createForm(this),
          textMap: {
          	add: this.$t('create'),
	        update: this.$t('update')
          },
          layout: {
          	labelCol: { span: 6 },
            wrapperCol: { span: 15 }
          },
          rules: {
              name: {
                rules: [
                  { required: true, message: '请输入姓名', trigger: 'blur' },
                  { min: 2, max: 15, message: '姓名为2-15个字符', trigger: 'blur' }
                ]
              },
              description: {
                rules: [
                    { required: true, message: '请输入详情', trigger: 'blur' },
                    { min: 2, max: 50, message: '详情为2-50个字符', trigger: 'blur' }
                ]
              }
          },
          methods: {
              createData () {},
              updateData () {},
              handleSubmit (e) {
                e.preventDefault()
                this.form.validateFields((err, values) => {
                  if (!err) {
                    console.log('values', values)
                    this.tempData.name = values.name
                    this.tempData.Description =  values.description 
                    if(this.modalType === 'create') {
                        this.createData()
                    } else {
                        this.updateData()
                    }
                  }
                })
              }
          }
         
      }
    }
}

这时可能有一个需求是编辑功能,当我们直接给表单赋值时用 value 或 v-modal 会报下面的错误

Warning: `getFieldDecorator` will override `value`, so please don‘t set `value` directly...

这时我们需要换种方式给表单赋值,用 form 的 api setFieldsValue 方法,代码实现如下

handleUpdate (row) {
	this.$nextTick(() => {
        this.form.setFieldsValue({
            name: this.tempData.name,
            description: this.tempData.description
        })
    })
}

注意

还有一种情况,如果 handleUpdate 方法需要使用异步的时候 async ,上面的 setFieldsValue 方法需要放在所有加 await 方法的后面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,ant-design-vue可以通过内置的Form组件和Table组件实现表格内部字段验证功能。具体步骤如下: 1. 在表格中添加需要验证的字段,例如下面的代码中的name和age字段: ```html <a-form :form="form"> <a-form-item label="Name" :rules="[{ required: true, message: 'Please input name' }]"> <a-input v-decorator="['name']" /> </a-form-item> <a-form-item label="Age" :rules="[{ required: true, message: 'Please input age' }]"> <a-input-number v-decorator="['age']" /> </a-form-item> </a-form> <a-table :columns="columns" :dataSource="dataSource" :pagination="false" /> ``` 2. 在表格中添加操作列,例如下面的代码中的操作列包含了编辑和删除按钮: ```html <a-table :columns="columns" :dataSource="dataSource" :pagination="false"> <template #action="text, record"> <a-button @click="edit(record)">Edit</a-button> <a-button @click="delete(record)">Delete</a-button> </template> </a-table> ``` 3. 在编辑操作中打开表单,并将当前行的数据绑定到表单中: ```javascript edit(record) { this.form.setFieldsValue(record); this.editingKey = record.key; } ``` 4. 在表单中添加保存按钮,并在点击保存按钮时进行表单验证和数据更新: ```html <a-form :form="form"> <a-form-item label="Name" :rules="[{ required: true, message: 'Please input name' }]"> <a-input v-decorator="['name']" /> </a-form-item> <a-form-item label="Age" :rules="[{ required: true, message: 'Please input age' }]"> <a-input-number v-decorator="['age']" /> </a-form-item> <a-form-item> <a-button type="primary" @click="save">Save</a-button> </a-form-item> </a-form> ``` ```javascript save() { this.form.validateFields((err, values) => { if (!err) { const newData = [...this.dataSource]; const index = newData.findIndex((item) => this.editingKey === item.key); if (index > -1) { const item = newData[index]; newData.splice(index, 1, { ...item, ...values }); this.dataSource = newData; this.editingKey = ''; } else { newData.push(values); this.dataSource = newData; this.editingKey = ''; } } }); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值