Vuelidate:在单击时验证,而不是在触摸字段时验证
Vuelidate: validate on click, not when field touched
我是 vuelidate 的新手,一切正常,除了我不知道如何 运行 仅在单击 提交 按钮时进行验证。现在,当您开始提供任何输入时,它会将触摸字段标记为红色,我希望它可以等待,直到用户想要提交填写好的表格。
这是我目前的情况:
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>`
我永远无法真正习惯 Vuelidate 的做事方式,但是,一般来说,它是这样工作的:https://monterail.github.io/vuelidate/#sub-basic-form
这样设置可以让您对每个表单进行验证 input/element,然后全面检查表单是否 "dirty" and/or "invalid"
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
然后要么显示错误,要么调用实际的提交方法
那么在设置验证之后您唯一需要做的就是调用一个方法来验证错误。所以请遵循以下内容:
<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
}
}
这是我用 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 的新手,一切正常,除了我不知道如何 运行 仅在单击 提交 按钮时进行验证。现在,当您开始提供任何输入时,它会将触摸字段标记为红色,我希望它可以等待,直到用户想要提交填写好的表格。
这是我目前的情况:
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>`
我永远无法真正习惯 Vuelidate 的做事方式,但是,一般来说,它是这样工作的:https://monterail.github.io/vuelidate/#sub-basic-form
这样设置可以让您对每个表单进行验证 input/element,然后全面检查表单是否 "dirty" and/or "invalid"
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
然后要么显示错误,要么调用实际的提交方法
那么在设置验证之后您唯一需要做的就是调用一个方法来验证错误。所以请遵循以下内容:
<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
}
}
这是我用 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
}
});
},