【发布时间】:2020-10-05 07:12:02
【问题描述】:
我正在使用 Vue.js 和 Bootstrap 来设计一个网站。我有一个表单,我正在尝试对其运行自定义验证。它工作正常,直到用户单击提交,根据引导文档将was-validated 类添加到表单中。
此时,无论是否满足我的自定义验证,具有任何输入的任何必填输入字段都被标记为有效并获得绿色边框和复选标记。我的自定义验证仍在运行并正确显示b-form-invalid-feedback。但是,似乎was-validated 将带有 required 属性的字段标记为有效,而没有考虑我的自定义验证,这会导致验证冲突,因为字段具有绿色复选标记(因为它满足所需的属性)但仍然是错误消息,因为根据我的自定义验证它还不是有效的。
我已尝试删除 :valid 样式,这不是我想要的效果,因为我确实希望它在根据我的验证有效时显示这些样式。希望这是有道理的,如果不是我会提供图片。我还有第二个问题,即使添加了was-validated,我的日期选择器也根本不显示b-form-invalid-feedback。
我的代码
<b-form @submit.prevent="addReview" name="review-form" novalidate>
<div class="name">
<label class="sr-only" for="form-input-name">Name</label>
<b-input id="form-input-name" class="form-inputs mb-2 mr-sm-2 mb-sm-0" v-model="name" placeholder="Name" required :state="isStateValid(this.name)"></b-input>
<b-form-invalid-feedback id="form-input-name">
You must enter a name
</b-form-invalid-feedback>
</div>
<div class="date">
<label class="sr-only" for="example-datepicker">Choose a date</label>
<b-form-datepicker id="datepicker" v-model="dateVisited" class="mb-2" required placeholder="Date Visited" :state="isStateValid(this.dateVisited)"></b-form-datepicker>
<b-form-invalid-feedback id="datepicker">
You must enter a valid date
</b-form-invalid-feedback>
</div>
<div class="service">
<label class="sr-only" for="form-input-service">Service Provided</label>
<b-input id="form-input-service" class="form-inputs mb-2" placeholder="Service Provided" v-model="service" required :state="isStateValid(this.service)"></b-input>
<b-form-invalid-feedback id="form-input-service">
You must enter the service provided
</b-form-invalid-feedback>
</div>
<div class="email">
<label class="sr-only" for="inline-form-input-username">Email</label>
<b-input id="inline-form-input-username" class="form-control mb-2 mr-sm-2 mb-sm-0" placeholder="Email" v-model="email" required :state="emailStateValidation"></b-input>
<b-form-invalid-feedback id="inline-form-input-username">
You must enter the part of your email that comes before the '@' symbol
</b-form-invalid-feedback>
</div>
<div class="domain">
<label class="sr-only" for="inline-form-input-domain">Domain</label>
<b-input-group prepend="@" class="mb-2 mr-sm-2 mb-sm-0">
<b-input id="inline-form-input-domain" placeholder="Domain ex: gmail.com" v-model="domain" required :state="domainStateValidation"></b-input>
<b-form-invalid-feedback id="inline-form-input-domain">
You must enter the part of your email that comes after the '@' symbol
</b-form-invalid-feedback>
</b-input-group>
</div>
<div class="description">
<label class="sr-only" for="textarea-rows">Describe Your Experience</label>
<b-form-textarea class="mb-3 mr-sm-2 mb-sm-0" id="textarea-rows" placeholder="Describe Your Experience" rows="4" required v-model="description" :state="isStateValid(this.description)"></b-form-textarea>
<b-form-invalid-feedback id="textarea-rows">
You must enter a description of your experience
</b-form-invalid-feedback>
</div>
<b-button type="submit">Save</b-button>
</b-form>
computed: {
emailStateValidation() {
if (this.email) {
return this.emailIsValid() ? true : false;
}
return null;
},
domainStateValidation() {
if (this.domain) {
return this.domainIsValid() ? true : false;
}
return null;
},
},
methods: {
emailIsValid() {
let regEx = /^(?!.*@)((^[^\.])[a-z0-9\.!#$%&'*+\-\/=?^_`{|}~"]*)*([^\.]$)/;
return regEx.test(this.email);
},
domainIsValid() {
let regEx = /((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return regEx.test(this.domain);
},
isStateValid(variable) {
if (variable) {
return variable.length > 0 ? true : false;
}
return null;
},
addReview() {
let mainForm = document.getElementsByName("review-form")[0];
mainForm.classList.add("was-validated");
...
问题
- 解决 required 和我的自定义验证之间的冲突 导致输入字段被过早标记为有效
- 在日期选择器上显示
b-form-invalid-feedback提交如果 未选择日期
【问题讨论】:
-
我很确定当您为此使用
b-form-group时,这两个问题都会得到解决 -
所以你可以用
b-form-group替换所有div's,然后在上面加上:state属性来显示b-form-invalid-feedback? -
请为此使用codesandbox.io 创建一个small demo 以显示正在发生的问题。
-
这里是Demo 关注的电子邮件字段,在提交表单之前验证工作正常但是在提交之后,如果输入任何输入,无论是否输入,这些字段都会被标记为绿色复选标记它是否满足我的自定义验证。然后 datepicker 不显示任何错误信息
标签: javascript twitter-bootstrap vue.js bootstrap-4 vue-cli