vuelidate ライブラリでVueJS2を使用しています。検証オブジェクトに基づいてフィールドを検証できます。検証は計算された時間中に実行されます。しかし、私の検証オブジェクトは動的ではなく固定されています。選択に基づいて非表示になるフィールドがいくつかあります。
import { validationMixin } from 'vuelidate'
import { required, maxLength, email } from 'vuelidate/lib/validators'
export default {
mixins: [validationMixin],
validations: {
company_name: { required },
company_position_title: { required }
},
methods: {
submit(){
this.$v.touch();
if(this.$v.$invalid == false){
// All validation fields success
}
}
}
}
[〜#〜] html [〜#〜]
<v-select
label="Who are you?"
v-model="select" // can be 'company' or 'others'
:items="items"
:error-messages="selectErrors"
@change="$v.select.$touch();resetInfoFields();"
@blur="$v.select.$touch()"
required
></v-select>
<v-text-field
label="Company Name"
v-model="company_name"
:error-messages="companyNameErrors"
:counter="150"
@input="$v.companyName.$touch()"
@blur="$v.companyName.$touch()"
v-show="select == 'Company'"
></v-text-field>
<v-text-field
label="Company Position Title"
v-model="company_position_title"
:error-messages="companyPositionErrors"
:counter="150"
@input="$v.companyPosition.$touch()"
@blur="$v.companyPosition.$touch()"
v-show="select == 'Company'"
></v-text-field>
<v-btn @click="submit">submit</v-btn>
問題
「その他」オプションを選択して送信をクリックすると、this.$v.$invalid
はまだ本当です。検証フィールドは必要ないため、falseにする必要があります。 'company'を選択すると、その2つのフィールドが必須で検証されている必要があります。
動的検証スキーマが必要です
validations () {
return {
if (!this.select === 'company') {
company_name: { required },
company_position_title: { required }
}
// other validations
}
}
詳細: 動的検証スキーマ
別の方法はrequiredIfを使用することです
itemtocheck: {
requiredIf: requiredIf(function () {
return this.myitem !== 'somevalue'
}),
minLength: minLength(2) },