我想禁用我的提交按钮,直到我的表单填写正确,这是我到目前为止:
<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: []
}
答案 0 :(得分:11)
在填写所需的所有值之前禁用按钮的一种方法是使用计算属性,如果分配了所有值,则返回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>
此按钮将被禁用,直到填写完所有字段且未发现错误
答案 1 :(得分:5)
最简单的方法是对表单使用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 :(得分:3)
将按钮设置为:disabled:"errors.any()"
会在验证后禁用按钮 。但是,在首次加载组件时,仍将启用它。
按照@im_tsm的建议,在this.$validator.validate()
方法中运行mounted()
会使表单在启动时进行验证并立即显示错误消息。该解决方案将使表单看起来非常难看。另外,Object.keys(this.fields).some(key => this.fields[key].invalid);
语法非常丑陋。
相反,单击按钮时运行验证器,在promise中获取有效性,然后在有条件的情况下使用它。使用此解决方案,表单在启动时看起来很干净,但是如果他们单击按钮,它将显示错误并禁用按钮。
<button :disabled="errors.any()" v-on:click="sendInvite();">
Send Invite
</button>
sendInvite() {
this.$validator.validate().then(valid=> {
if (valid) {
...
}
})
}
答案 3 :(得分:2)
或使用计算
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">
答案 4 :(得分:2)
另一种方法是利用v-validate。初始
<input type="text" class="form-control" v-validate.initial="'required|email'" name="email" placeholder="Email" v-model="userCreate.userPrincipalName" />
这将在页面加载后执行电子邮件输入元素的验证。并且使您的按钮在与输入进行交互之前被禁用。
答案 5 :(得分:2)
要检查表单是否无效,我们可以添加一个computed
属性,如下所示:
computed: {
isFormInValid() {
return Object.keys(this.fields).some(key => this.fields[key].invalid);
},
},
现在,如果您想在用户与任何字段进行交互之前立即开始检查,则可以在mounted
生命周期挂钩中手动进行验证:
mounted() {
this.$validator.validate();
}
答案 6 :(得分:1)
确保可以查看表单字段。
获取对验证器实例的引用:
<ValidationObserver ref="validator">
。
每当表单字段更改时,触发验证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>
答案 7 :(得分:0)
您可以添加计算属性
...
computed: {
isFormValid () {
return Object.values(this.fields).every(({valid}) => valid)
}
}
...
并将其绑定到按钮:
<button :disabled="!isFormValid" class="btn btn-primary" type="submit">Send Invite</button>
我尝试使用vee验证版本^ 2.0.3