【问题标题】:Vuetify form validation errors after reset重置后 Vuetify 表单验证错误
【发布时间】:2019-07-14 08:53:17
【问题描述】:

我在组件中有以下内容:

<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 警告]:nextTick 中的错误:"TypeError:无法读取属性 '长度'未定义"

TypeError: 无法读取未定义的属性“长度”

【问题讨论】:

    标签: vue.js vuetify.js


    【解决方案1】:

    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>

    【讨论】:

    • 哦,当然。我坚持 validate() 再次运行但它没有运行的想法,这是因为我将数据值设置为等于不存在的东西 (v)。谢谢你的回答。
    • 这种方法可行,但仍然令人费解?为什么reset() 触发:rules。 ?应该有办法防止这种情况发生。
    猜你喜欢
    • 2018-12-06
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多