[elementui]form表单先编辑后新建form自动触发校验

element form表单先编辑后新建form自动触发校验

problem

版本:element plus
操作步骤:

  • 编辑表单内容,没做调整,取消
  • 再次新建表单,弹窗打开
  • 例如表单内容包含场景名称 sceneName 字段
    实际结果:
  • 再次新建表单,会提示字段名为空的校验
    期望结果:
  • 再次新建表单,不要校验表单,不要提示字段名为空的校验

reason

  • 打开编辑弹窗后 formData.sceneName=‘任务系统’
  • 编辑弹窗关闭后,调用 state.formRef.resetFields() 期望将formData内容情况 formData.sceneName=undefined
  • 实际这个字段内容没清空,依然是 formData.sceneName=‘任务系统’
  • 然后再次打开新建弹窗,初始化 formData.sceneName=undefined
  • form发现 sceneName之前是’任务系统’,现在是 undefined,发生了changed,就触发了校验规则
  • 总结:问题出在 element resetfields 无效

solution

  • 在 form mounted之前,如果给form表单赋值了,那么后面调用resetFields()都是无效的
  • 解决办法1(网上): 先设置 this.visible = true; 再在nextTick内设置formData的值 --我的依然无效
  • 解决办法2:打开弹窗后,清空校验信息
  • 解决办法3:手动设置formData为初始值
function openDialog({ formType, row }: DialogFormType<SceneForm>) {
  state.formData = (row || {}) as SceneForm;
  state.title = dialogTitle[formType];
  state.formType = formType;
  getDataTree().then(({ data }) => {
    state.list = data;
    state.visible = true;
    // 解决办法2 
    setTimeout(() => {
      state.formRef && state.formRef.clearValidate && state.formRef.clearValidate();
    });
  });
}

function closeDialog() {
    // state.formRef.resetFields(); // 无效
  state.formRef.clearValidate();
  state.visible = false;
}
function openDialog({ formType, row }: DialogFormType<SceneForm>) {
  state.formData = (row || {}) as SceneForm;
  state.title = dialogTitle[formType];
  state.formType = formType;
  getDataTree().then(({ data }) => {
    state.list = data;
    state.visible = true;
  });
}

function closeDialog() {
    // state.formRef.resetFields(); // 无效
  // 解决办法3 
  state.formData = {} as SceneForm;
  state.formRef.clearValidate();
  state.visible = false;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你使用的是 Vant 2.x 版本,可以尝试加上`ref`属性,然后在提交表单的时候手动触发校验,示例代码如下: ```html <template> <van-form ref="form"> <van-field v-model="name" name="name" label="用户名" placeholder="请输入用户名" :rules="nameRules"></van-field> <van-field v-model="password" type="password" name="password" label="密码" placeholder="请输入密码" :rules="passwordRules"></van-field> <van-button type="primary" @click="submitForm">提交</van-button> </van-form> </template> <script> export default { data() { return { name: '', password: '', nameRules: [ { required: true, message: '请输入用户名' } ], passwordRules: [ { required: true, message: '请输入密码' } ] } }, methods: { submitForm() { this.$refs.form.validate((valid) => { if (valid) { // 校验通过,提交表单 console.log('submit form') } else { // 校验不通过 console.log('validate failed') } }) } } } </script> ``` 如果使用的是 Vant 3.x 版本,可以使用 `validate` 方法自动触发校验,示例代码如下: ```html <template> <van-form :model="form" :rules="rules"> <van-field v-model="form.name" name="name" label="用户名" placeholder="请输入用户名"></van-field> <van-field v-model="form.password" type="password" name="password" label="密码" placeholder="请输入密码"></van-field> <van-button type="primary" @click="submitForm">提交</van-button> </van-form> </template> <script> export default { data() { return { form: { name: '', password: '' }, rules: { name: [ { required: true, message: '请输入用户名' } ], password: [ { required: true, message: '请输入密码' } ] } } }, methods: { submitForm() { this.$refs.form.validate((valid) => { if (valid) { // 校验通过,提交表单 console.log('submit form') } else { // 校验不通过 console.log('validate failed') } }) } } } </script> ``` 其中 `:model` 绑定表单数据,`:rules` 绑定校验规则,点击提交按钮时通过 `validate` 方法触发校验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值