【问题标题】:Using Vee-validate to disable button until form is filled out correctly使用 Vee-validate 禁用按钮,直到正确填写表单
【发布时间】:2018-04-21 01:37:56
【问题描述】:

我想禁用我的提交按钮,直到我的表单被正确填写,这是我目前所拥有的:

<form>
   <input type="text" class="form-control" v-validate="'required|email'" name="email" placeholder="Email" v-model="userCreate.userPrincipalName" />
   <span v-show="errors.has('email')">{{ errors.first('email') }}</span>
   <button v-if="errors.any()" disabled="disabled" class="btn btn-primary" v-on:click="sendInvite();" data-dismiss="modal" type="submit">Send Invite</button>
   <button v-else="errors.any()" class="btn btn-primary" v-on:click="sendInvite();" data-dismiss="modal" type="submit">Send Invite</button>
</form>

在我开始输入一个值后,上面只打印一条错误消息并禁用我的提交按钮。在开始与输入交互之前,我需要从一开始就禁用它,这样我就不能发送空字符串。

另一个问题是是否有比使用v-if更好的方法来做到这一点?

编辑:

 userCreate: {
        customerId: null,
        userPrincipalName: '',
        name: 'unknown',
        isAdmin: false,
        isGlobalAdmin: false,
        parkIds: []
    }

【问题讨论】:

    标签: vue.js vuejs2 vee-validate


    【解决方案1】:

    可能最简单的方法是使用ValidationObserver 插槽作为表单。像这样:

    <ValidationObserver v-slot="{ invalid }">
      <form @submit.prevent="submit">
        <InputWithValidation rules="required" v-model="first" :error-messages="errors" />
        <InputWithValidation rules="required" v-model="second" :error-messages="errors" />
        <v-btn :disabled="invalid">Submit</v-btn>
      </form>
    </ValidationObserver>
    

    更多信息 - Validation Observer

    【讨论】:

    • 我相信这是最简单的方法。应该被接受的答案。
    【解决方案2】:

    将按钮设置为:disabled:"errors.any()" 会在验证后 禁用按钮。但是,当组件第一次加载时,它仍然会被启用。

    正如@im_tsm 建议的那样,在mounted() 方法中运行this.$validator.validate() 会导致表单在启动时验证并立即显示错误消息。该解决方案将导致表单看起来很丑陋。此外,Object.keys(this.fields).some(key =&gt; this.fields[key].invalid); 语法非常丑陋。


    相反,在单击按钮时运行验证器,在 Promise 中获取有效性,然后在条件中使用它。使用此解决方案,表单在启动时看起来很干净,但如果他们单击按钮,它将显示错误并禁用按钮。

    <button :disabled="errors.any()" v-on:click="sendInvite();">
        Send Invite
    </button>
    
    sendInvite() {
        this.$validator.validate().then(valid=> {
            if (valid) {
                ...
            }
        })
    }
    

    Validator API

    【讨论】:

      【解决方案3】:

      在填充所需的所有值之前禁用按钮的一种方法是使用计算属性,如果所有值都已分配,则该属性将返回 bool

      例子:

      像这样创建一个计算属性:

      computed: {
        isComplete () {
          return this.username && this.password && this.email;
        }
      }
      

      并将其绑定到 html disabled 属性为:

      <button :disabled='!isComplete'>Send Invite</button
      

      这意味着,如果!isComplete 为真,则禁用按钮

      此外,在您的情况下,您不需要两个 if/else-bound 按钮。您可以根据表单是否完成有任何错误来隐藏/显示它:

      <button :disabled="errors.any() || !isCompleted" class="btn btn-primary" v-on:click="sendInvite();" data-dismiss="modal" type="submit">Send Invite</button>
      

      在填写所有字段且未发现错误之前,此按钮将被禁用

      【讨论】:

      • 这个答案完全错误!!!!!!!如果计算属性必须重新进行所有验证,那么使用 vee-validate 有什么意义???顺便说一句,计算属性只检查非空值,但不检查有效的电子邮件格式或任何其他可能的规则!!!!
      • @Merlevede。将答案称为“完全错误”然后不提供任何帮助或细节是非常有帮助的。正确的做法是什么?
      【解决方案4】:

      另一种方法是使用 v-validate。initial

      <input type="text" class="form-control" v-validate.initial="'required|email'" name="email" placeholder="Email" v-model="userCreate.userPrincipalName" />
      

      这将在页面加载后执行电子邮件输入元素的验证。并使您的按钮在与输入交互之前被禁用。

      【讨论】:

        【解决方案5】:

        要检查表单是否无效,我们可以像这样添加computed 属性:

        computed: {
            isFormInValid() {
              return Object.keys(this.fields).some(key => this.fields[key].invalid);
            },
        },
        

        现在,如果您想在用户与任何字段交互之前立即开始检查,您可以在 mounted 生命周期挂钩中手动验证:

        mounted() {
           this.$validator.validate();
        }
        

        【讨论】:

          【解决方案6】:

          或使用计算

          computed: { 
              formValidated() { 
                  return Object.keys(this.fields).some(key => this.fields[key].validated) && Object.keys(this.fields).some(key => this.fields[key].valid);
                  } 
          }
          

          并使用

          button :disabled="!formValidated" class="btn btn-primary" v-on:click="sendInvite();" data-dismiss="modal" type="submit">
          

          【讨论】:

          • formValidated 将是 true 如果其中一个字段是 valid && validated 这是不需要的
          【解决方案7】:

          对于当前版本 3(截至撰写本文时)。

          步骤 1

          确保可以查看表单字段。

          第二步

          获取对验证器实例的引用: &lt;ValidationObserver ref="validator"&gt;.

          第三步

          每当表单字段更改时触发验证silently

          这是一个例子:

               export default {
                  data() {
                      return {
                          form: {
                              isValid: false,
                              fields: {
                                  name: '',
                                  phone: '',
                              }
                          }
                      }
                  },
          
                  watch: {
                      'form.fields': {
                          deep: true,
                          handler: function() {
                              this.updateFormValidity();
                          }
                      }
                  },
                  methods: {
                      async updateFormValidity() {
                          this.form.isValid = await this.$refs.validator.validate({
                              silent: true // Validate silently and don't cause observer errors to be updated. We only need true/false. No side effects.
                          });
                      },
                  }
              }
          
          <button :disabled="form.isValid">
              Submit
          </button>
          

          【讨论】:

          • 不应该是this.form.isValid = ...而不是this.form.validatorIsValid = ...吗?
          【解决方案8】:

          您可以添加计算属性

            ...
            computed: {
                isFormValid () {
                    return Object.values(this.fields).every(({valid}) => valid)
                }
            }
            ...
          

          它绑定到按钮:

          <button :disabled="!isFormValid" class="btn btn-primary" type="submit">Send Invite</button>
          

          我在 vee-validate 版本 ^2.0.3 上试试这个

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-03-08
            • 2020-11-12
            • 1970-01-01
            • 2023-03-23
            • 1970-01-01
            • 2012-12-05
            • 2018-01-22
            • 2021-01-19
            相关资源
            最近更新 更多