【问题标题】:Vuelidate: validate on click, not when field touchedVuelidate:在点击时验证,而不是在触摸字段时验证
【发布时间】:2018-02-09 13:34:06
【问题描述】:

我对 vuelidate 有点陌生,一切正常,除了我不知道如何仅在单击按钮 Submit 时运行验证。现在,当您开始提供任何输入时,它会将触摸字段标记为红色,我希望它等待,直到用户想要提交填写的表单。

这是我现在所做的:

Vue.use(window.vuelidate.default)
const { required, minLength, sameAs } = window.validators

new Vue({
	el: "#app",
  data: {
  	user: {
    	login: '',
      password: '',
      repeatedPassword: ''
    }
  },
  validations: {
  	user: {
    	login: {
      	required,
        minLength: minLength(5)
      },
      password: {
    	  required,
        minLength: minLength(8)
      },
      repeatedPassword: {
      	required,
        sameAs: sameAs('password')
      }
    }
  }
})
input {
  border: 1px solid silver;
  border-radius: 4px;
  background: white;
  padding: 5px 10px;
}

.error {
  border-color: red;
  background: #FDD;
}

.error:focus {
  outline-color: #F99;
}

.valid {
  border-color: #5A5;
  background: #EFE;
}

.valid:focus {
  outline-color: #8E8;
}
<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/vuelidate/dist/validators.min.js"></script>
<script src="https://unpkg.com/vuelidate/dist/vuelidate.min.js"></script>
`<div id="app">

  <input type="text" placeholder="login"
    v-model="user.login"
    v-on:input="$v.user.login.$touch"
    v-bind:class="{error: $v.user.login.$error, valid: $v.user.login.$dirty && !$v.user.login.$invalid}">
  <br/>    
  <input type="password" placeholder="password"
    v-model="user.password"
    v-on:input="$v.user.password.$touch"
    v-bind:class="{error: $v.user.password.$error, valid: $v.user.password.$dirty && !$v.user.password.$invalid}">
  <br/>  
  <input type="password" placeholder="repeat password"
    v-model="user.repeatedPassword"
    v-on:input="$v.user.repeatedPassword.$touch"
    v-bind:class="{error: $v.user.repeatedPassword.$error, valid: $v.user.repeatedPassword.$dirty && !$v.user.repeatedPassword.$invalid}"
  >
  <button :disabled="$v.user.$error" @click="$v.user.$touch()">
    Submit!
  </button>
</div>`

【问题讨论】:

    标签: javascript vue.js onclick vuelidate


    【解决方案1】:

    这是我使用 VeeValidate 3 所做的:

    <validation-observer ref="jobValidation">
     <form>
         <button v-on:click="nextPage()" type="button">Next</button>
     </form>
    </validation-observer>
    

    方法内:

    nextPage(): void {                 
        const validation = (this.$refs.jobValidation as any);
        validation.validate().then(() => {                 
        if (validation.flags.invalid) {                           
            // No no no no
            // bonus: show all errors in summary
            validation.$children.forEach((child: any) => {
               child.errors.forEach((error: any) => {
                  console.log(error);
               });
               return;
            });
        } else {
            // Yes yes yes
        }
        });  
    },
    

    【讨论】:

    • 这是 Vuelidate 问题,没有 VeeValidate
    【解决方案2】:

    那么在设置验证之后您唯一要做的就是调用一个验证错误的方法。所以请遵循以下:

    <button @click="validate">Submit</button>
    

    方法:

    validate () {
      this.$v.$touch() //it will validate all fields
      if (!this.$v.$invalid) { //invalid, becomes true when a validations return false
       //you dont have validation error.So do what u want to do here
      }
    }
    

    【讨论】:

      【解决方案3】:

      我永远无法真正习惯 Vuelidate 的做事方式,但一般来说,它是这样工作的:https://monterail.github.io/vuelidate/#sub-basic-form

      这样设置允许您对每个表单输入/元素进行验证,然后全面检查表单是否“脏”和/或“无效”

      form: {
      "name": {
      "required": false,
      "$invalid": true,
      "$dirty": false,
      "$error": false,
      "$pending": false,
      "$params": {
        "required": {
          "type": "required"
        }
      }
      },
      "Age": {
        "required": false,
        "$invalid": true,
        "$dirty": false,
        "$error": false,
        "$pending": false,
        "$params": {
          "required": {
            "type": "required"
          }
        }
      },
      "$invalid": true,  <------- This is what you are after for valid/invalid
      "$dirty": false,   <------- This is what you are after to see if the form has been used.
      "$error": false,  <-------  This checks both invalid and dirty
      "$pending": false,
      "$params": {
         "nestedA": null,
         "nestedB": null
      }
      }
      

      就在实践中使用它而言,一种选择是在提交时调用 validateform 事件。

      @click.prevent="validateform"
      

      然后在你的 vue 实例中创建一个 validateform 方法来检查

      $v.form.$invalid  or $v.form.$error
      

      然后要么显示错误,要么调用实际的提交方法

      【讨论】:

      • 上下文还是有帮助的,但是链接是404
      猜你喜欢
      • 2020-03-17
      • 2016-07-05
      • 2015-01-07
      • 2020-06-09
      • 1970-01-01
      • 2021-03-07
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多