重置后 Vuetify 表单验证错误
Vuetify form validation errors after reset
我在一个组件中有以下内容:
<v-form v-model="valid" ref="form" class="px-3">
<v-text-field label="First Name" v-model="firstname" :rules="inputRules"></v-text-field>
<v-text-field label="Last Name" v-model="lastname" :rules="inputRules"></v-text-field>
<v-text-field label="Email" v-model="email"></v-text-field>
<v-btn :loading="loading" flat class="success mx-0 mt-3" @click="submit">Create Person</v-btn>
</v-form>
脚本:
export default {
data() {
return {
valid: true,
firstname: '',
lastname: '',
email: '',
loading: false,
dialog: false,
inputRules: [
v => v.length >= 2 || 'Minimum length is 2 characters'
]
}
},
methods: {
submit() {
if(this.$refs.form.validate()) {
this.loading = true;
const person = {
firstname: this.firstname,
lastname: this.lastname,
email: this.email
};
sendToMyDB(person).then(()=>{
this.loading = false;
this.dialog = false;
this.$refs.form.reset();
})
}
}
}
}
所以我将表单数据提交到我的数据库,然后在成功承诺中我使用了 this.$refs.form.reset();重置我的表单。
但是,我在每次提交后立即收到错误消息:
"[Vue warn]: Error in nextTick: "TypeError: Cannot read property
'length' of undefined"
和
TypeError: Cannot read property 'length' of undefined
Vuetify 正在将 undefined
传递给 inputRules
中引用的函数。您可以看到它读取堆栈调用:
我建议您在访问其内容之前测试 v
是否为 undefined
:
v => (v && v.length >= 2) || 'Minimum length is 2 characters'
或
v => (!v || v.length >= 2) || 'Minimum length is 2 characters'
取决于您的业务规则。
var app = new Vue({
el: '#app',
data() {
return {
valid: true,
firstname: '',
lastname: '',
email: '',
loading: false,
dialog: false,
inputRules: [
v => (v && v.length >= 2) || 'Minimum length is 2 characters'
]
}
},
methods: {
submit() {
if (this.$refs.form.validate()) {
this.loading = true;
const person = {
firstname: this.firstname,
lastname: this.lastname,
email: this.email
};
/* sendToMyDB(person) */
Promise.resolve().then(() => {
this.loading = false;
this.dialog = false;
this.$refs.form.reset();
})
}
}
}
});
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
<script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
<div id="app">
<v-form v-model="valid" ref="form" class="px-3">
<v-text-field label="First Name" v-model="firstname" :rules="inputRules"></v-text-field>
<v-text-field label="Last Name" v-model="lastname" :rules="inputRules"></v-text-field>
<v-text-field label="Email" v-model="email"></v-text-field>
<v-btn :loading="loading" text class="success mx-0 mt-3" @click="submit">Create Person</v-btn>
</v-form>
</div>
我在一个组件中有以下内容:
<v-form v-model="valid" ref="form" class="px-3">
<v-text-field label="First Name" v-model="firstname" :rules="inputRules"></v-text-field>
<v-text-field label="Last Name" v-model="lastname" :rules="inputRules"></v-text-field>
<v-text-field label="Email" v-model="email"></v-text-field>
<v-btn :loading="loading" flat class="success mx-0 mt-3" @click="submit">Create Person</v-btn>
</v-form>
脚本:
export default {
data() {
return {
valid: true,
firstname: '',
lastname: '',
email: '',
loading: false,
dialog: false,
inputRules: [
v => v.length >= 2 || 'Minimum length is 2 characters'
]
}
},
methods: {
submit() {
if(this.$refs.form.validate()) {
this.loading = true;
const person = {
firstname: this.firstname,
lastname: this.lastname,
email: this.email
};
sendToMyDB(person).then(()=>{
this.loading = false;
this.dialog = false;
this.$refs.form.reset();
})
}
}
}
}
所以我将表单数据提交到我的数据库,然后在成功承诺中我使用了 this.$refs.form.reset();重置我的表单。
但是,我在每次提交后立即收到错误消息:
"[Vue warn]: Error in nextTick: "TypeError: Cannot read property 'length' of undefined"
和
TypeError: Cannot read property 'length' of undefined
Vuetify 正在将 undefined
传递给 inputRules
中引用的函数。您可以看到它读取堆栈调用:
我建议您在访问其内容之前测试 v
是否为 undefined
:
v => (v && v.length >= 2) || 'Minimum length is 2 characters'
或
v => (!v || v.length >= 2) || 'Minimum length is 2 characters'
取决于您的业务规则。
var app = new Vue({
el: '#app',
data() {
return {
valid: true,
firstname: '',
lastname: '',
email: '',
loading: false,
dialog: false,
inputRules: [
v => (v && v.length >= 2) || 'Minimum length is 2 characters'
]
}
},
methods: {
submit() {
if (this.$refs.form.validate()) {
this.loading = true;
const person = {
firstname: this.firstname,
lastname: this.lastname,
email: this.email
};
/* sendToMyDB(person) */
Promise.resolve().then(() => {
this.loading = false;
this.dialog = false;
this.$refs.form.reset();
})
}
}
}
});
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
<script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
<div id="app">
<v-form v-model="valid" ref="form" class="px-3">
<v-text-field label="First Name" v-model="firstname" :rules="inputRules"></v-text-field>
<v-text-field label="Last Name" v-model="lastname" :rules="inputRules"></v-text-field>
<v-text-field label="Email" v-model="email"></v-text-field>
<v-btn :loading="loading" text class="success mx-0 mt-3" @click="submit">Create Person</v-btn>
</v-form>
</div>