重置后Vuetify表单验证错误

mbr*_*iff 2 vue.js vuetify.js

我在一个组件中有以下内容:

<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>
Run Code Online (Sandbox Code Playgroud)

脚本:

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();
        })
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

所以我将表单数据提交到我的数据库然后在成功承诺中使用 this.$refs.form.reset(); 重置我的表格。

但是,我会立即收到错误消息,并且在每次后续提交时都会收到错误消息:

“[Vue 警告]:nextTick 中的错误:“TypeError:无法读取未定义的属性‘长度’”

类型错误:无法读取未定义的属性“长度”

lma*_*rqs 6

Vuetify 正在传递undefinedinputRules. 您可以看到它读取堆栈调用:

调用栈

我建议您在访问其内容之前测试是否vundefined

v => (v && v.length >= 2) || 'Minimum length is 2 characters' 
Run Code Online (Sandbox Code Playgroud)

或者

v => (!v || v.length >= 2) || 'Minimum length is 2 characters'
Run Code Online (Sandbox Code Playgroud)

取决于您的业务规则。

v => (v && v.length >= 2) || 'Minimum length is 2 characters' 
Run Code Online (Sandbox Code Playgroud)
v => (!v || v.length >= 2) || 'Minimum length is 2 characters'
Run Code Online (Sandbox Code Playgroud)

  • 这种方法很有效,但仍然令人困惑的是为什么 `reset()` 会触发 `:rules`。应该有办法防止这种情况发生。 (2认同)