Vue + Vuetify 清除表单时的验证问题
Vue + Vuetify Validation issue when clearing form
我正在尝试为我的应用程序构建一些简单的 CRUD 功能,我想重新使用相同的表单来创建和更新。
我正在更新的模型是菜单。
我这样做的方法(如果有更好的方法请告诉我)是在新按钮上有一个方法 openForm(menu = null)
我只是不传递菜单,而在编辑按钮上我做.
openForm 然后检查 menu 是否为 null 以及它是否创建一个空菜单对象。
然后将其作为 menuForForm 存储在 data()
中。
我的表单接收这个作为道具,用于呈现我的表单。
我的问题是,当我使用 Vuetify $refs.form.reset()
方法清除表单时,我得到了一大堆与空值相关的错误。这似乎是由于验证规则,就好像我删除它们一样。
我不明白为什么字段值为 null 会导致这些问题,就好像我将表单绑定到正常的 data()
字段一样工作正常。
这是我的代码:
父组件
<template>
<v-flex xs12 sm6 lg4>
<v_form
v-if="menuForForm"
:menu="menuForForm"
>
</v_form>
</v-flex>
</template>
<script>
data() {
return {
menuForForm: null,
newMenu: {
id: '',
label: '',
url: '',
},
}
},
methods: {
openMenuForm(menu = null) {
menu ? this.menuForForm = JSON.parse(JSON.stringify(menu)) :
this.menuForForm = this.newMenu;
this.$store.dispatch('setShowForm', true);
},
}
</script>
表单组件
<template>
<v-form ref="form" v-model="valid">
<v-text-field
v-model="menu.label"
:rules="labelRules"
label="Label"
required
>
</v-text-field>
<v-btn
color="primary"
:disabled="!valid"
@click="submit"
>
submit
</v-btn>
<v-btn
@click="clear"
>
clear
</v-btn>
</v-form>
</template>
<script>
data(){
return{
valid: true,
labelRules: [
v => !!v || 'Name is required',
v => v.length >= 3 || 'Label must be atleast than 3 characters'
],
}
},
methods:{
clear() {
this.$refs.form.reset();
}
}
</script>
这是我点击清除时得到的错误:
[Vue warn]: Error in callback for watcher "value": "TypeError: Cannot read property 'length' of null"
found in
---> <VTextField>
[Vue warn]: Error in nextTick: "TypeError: Cannot read property 'length' of null"
found in
---> <VTextField>
TypeError: Cannot read property 'length' of null
at labelRules (Form.vue?c13f:61)
有没有人知道为什么会这样,我已经研究了好几个小时了,这让我发疯。
你的规则应该是
data(){
return{
valid: true,
labelRules: [
v => !!v || 'Name is required',
v => (v && v.length >= 3) || 'Label must be atleast than 3 characters'
],
}
}
因为在重置时,表单会将值设置为 null
我正在尝试为我的应用程序构建一些简单的 CRUD 功能,我想重新使用相同的表单来创建和更新。
我正在更新的模型是菜单。
我这样做的方法(如果有更好的方法请告诉我)是在新按钮上有一个方法 openForm(menu = null)
我只是不传递菜单,而在编辑按钮上我做.
openForm 然后检查 menu 是否为 null 以及它是否创建一个空菜单对象。
然后将其作为 menuForForm 存储在 data()
中。
我的表单接收这个作为道具,用于呈现我的表单。
我的问题是,当我使用 Vuetify $refs.form.reset()
方法清除表单时,我得到了一大堆与空值相关的错误。这似乎是由于验证规则,就好像我删除它们一样。
我不明白为什么字段值为 null 会导致这些问题,就好像我将表单绑定到正常的 data()
字段一样工作正常。
这是我的代码:
父组件
<template>
<v-flex xs12 sm6 lg4>
<v_form
v-if="menuForForm"
:menu="menuForForm"
>
</v_form>
</v-flex>
</template>
<script>
data() {
return {
menuForForm: null,
newMenu: {
id: '',
label: '',
url: '',
},
}
},
methods: {
openMenuForm(menu = null) {
menu ? this.menuForForm = JSON.parse(JSON.stringify(menu)) :
this.menuForForm = this.newMenu;
this.$store.dispatch('setShowForm', true);
},
}
</script>
表单组件
<template>
<v-form ref="form" v-model="valid">
<v-text-field
v-model="menu.label"
:rules="labelRules"
label="Label"
required
>
</v-text-field>
<v-btn
color="primary"
:disabled="!valid"
@click="submit"
>
submit
</v-btn>
<v-btn
@click="clear"
>
clear
</v-btn>
</v-form>
</template>
<script>
data(){
return{
valid: true,
labelRules: [
v => !!v || 'Name is required',
v => v.length >= 3 || 'Label must be atleast than 3 characters'
],
}
},
methods:{
clear() {
this.$refs.form.reset();
}
}
</script>
这是我点击清除时得到的错误:
[Vue warn]: Error in callback for watcher "value": "TypeError: Cannot read property 'length' of null"
found in
---> <VTextField>
[Vue warn]: Error in nextTick: "TypeError: Cannot read property 'length' of null"
found in
---> <VTextField>
TypeError: Cannot read property 'length' of null
at labelRules (Form.vue?c13f:61)
有没有人知道为什么会这样,我已经研究了好几个小时了,这让我发疯。
你的规则应该是
data(){
return{
valid: true,
labelRules: [
v => !!v || 'Name is required',
v => (v && v.length >= 3) || 'Label must be atleast than 3 characters'
],
}
}
因为在重置时,表单会将值设置为 null