【问题标题】:Vue.js - Element UI - How to know the state of form validationVue.js - Element UI - 如何知道表单验证的状态
【发布时间】:2017-11-08 00:05:17
【问题描述】:

我正在使用 vue-jselement-ui

我想检查表单的验证状态,而无需单击submit button

示例

https://jsfiddle.net/nw8mw1s2/

重现步骤

点击每个字段

通过模糊触发验证

开始填充不同的输入

问题

当验证最后一个输入时,isFormValidated 会变成true,我该怎么做。

也就是说,我怎么说“如果没有状态错误的字段,则将valudateState转为true”

提示

我想我们可以检查表单的每个formItemvalidateState。但我不知道具体怎么做。

【问题讨论】:

    标签: vuejs2 element-ui


    【解决方案1】:

    我会创建一个新方法(比如updateIsFormValidated),并将其绑定到表单的原生focusout 事件:

    <el-form :model="ruleForm2" @focusout.native="updateIsFormValidated" ...>
    

    每次表单中的任何输入失去焦点时都会触发此方法。它将尝试检查表单组件中的每个字段是否已成功验证,如果任何表单项的验证状态仍处于等待状态,则每 100 毫秒触发一次:

    updateIsFormValidated() {
      let fields = this.$refs.ruleForm2.fields;
      if (fields.find((f) => f.validateState === 'validating')) {
        setTimeout(() => { this.updateIsFormValidated() }, 100);
      } else {
        this.isFormValidated = fields.reduce((acc, f) => {
          let valid = (f.isRequired && f.validateState === 'success');
          let notErroring = (!f.isRequired && f.validateState !== 'error');
          return acc && (valid || notErroring);
        }, true);
      }
    }
    

    Here's a working fiddle.

    【讨论】:

    • 如果其中一个字段不是强制性的或没有任何要针对jsfiddle.net/wwyxt8es验证的规则,则该解决方案不起作用
    • 您可能想将 let fields = this.$refs.ruleForm2.fields; 更改为 let mandatoryFields = this.$refs.informationTabForm.fields.filter((f) =&gt; f.isRequired === true); 无论如何,很好的解决方案,谢谢
    • 当涉及clereable dropdown 时,我也找不到一个好的解决方案:jsfiddle.net/mab3q4f1
    • @Leo 更新了reduce 函数,将字段的required 属性考虑在内。不确定下拉组件,看起来它与表单的本机事件不兼容。也许您只需要在该组件的事件之一上指定 updateIsFormValidated 处理程序。
    • 我为radio 的同样原因而挣扎 似乎validateStateevent change 被触发之前没有更新。因此,要验证select,您最好使用visible-change 事件,而对于radio,它不起作用
    猜你喜欢
    • 2019-12-15
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2020-05-16
    • 2021-05-30
    • 2020-11-24
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多