【问题标题】:Can't validate v-text-field [migrating from older version of Vuetify]无法验证 v-text-field [从旧版本的 Vuetify 迁移]
【发布时间】:2021-04-24 20:29:43
【问题描述】:

自 Entity Framework 5 发布以来,我一直在迁移去年的旧项目。由于我也在从去年使用的 Vuetify 的先前版本(从 2.2.11 到 2.4.0)迁移前端,所以我遇到了一些我不得不在网上查找并修复的问题,但我遇到了这个突然的问题,我无法完全解决,也无法找到类似的问题的答案。

如果 v-text-field 长度小于 3 或大于 50 个字符,我正在尝试验证 v-card 中的 v-text-field 以不保存记录。尽管我已经跟进了去年用来验证我的 v-text-field 的相同代码,但我在 chrome 控制台上收到以下错误:

当您单击保存时,此图像中的最后 2 个错误会弹出,此时应显示验证消息:

组件中使用的代码如下。

对于应该在描述 v-text-field 下方以红色弹出的验证消息:

VUE:

<template v-slot:top>
    <v-toolbar flat>   
        <v-dialog v-model="dialog" max-width="500px">
            <template v-slot:activator="{ on, attrs }">
                <v-btn color="primary" dark class="mb-2" v-bind="attrs" v-on="on">New</v-btn>
            </template>
            <v-card>
                <v-container>
                    <v-row>
                        <v-col cols="12" sm="12" md="12">
                            <v-text-field v-model="name" label="Name"></v-text-field>
                        </v-col>
                        <v-col cols="12" sm="12" md="12">
                            <v-text-field v-model="description" label="Description"></v-text-field>
                                </v-col>
                        <v-col cols="12" sm="12" md="12" v-show="valida">
                            <div class="red--text" v-for="v in validaMessage" :key="v" v-text="v">
                            </div>
                        </v-col>
                    </v-row>
                </v-container>
            </v-card>
        </v-dialog>
    </v-toolbar>
</template>

JAVASCRIPT:

<script>
    import axios from 'axios'
    export default {

        data(){
            return {
                categories:[],
                dialog: false,
                dialogDelete: false,
                headers: [
                    { text: 'Options', value: 'actions', sortable: false, class:"primary--text" },
                    { text: 'Name', value: 'name', class:"primary--text" },
                    { text: 'Description', value: 'description', sortable: false, class:"primary--text" },
                    { text: 'Status', value: 'status', sortable: false, class:"primary--text" },
                ],
                search: '',
                desserts: [],
                editedIndex: -1,
                editedItem: {
                    name: '',
                    calories: 0,
                    fat: 0,
                    carbs: 0,
                    protein: 0,
                },
                id: '',
                name: '',
                description: '',
                valida: 0,
                validaMessage:[]
            }
        },
        methods: {
            save () {
                if (this.valida()){
                    return;
                }
                if (this.editedIndex > -1) {
                    //Code to update
                } 
                else {
                    let me=this;
                    axios.post('api/Categories/Create',{
                        'name': me.name,
                        'description': me.description
                    }).then(function(response){
                        me.close();
                        me.list();
                        me.clean();
                    }).catch(function(error){
                        console.log(error);
                    });
                }
            },
            valida(){
                this.valida=0;
                this.validaMessage=[];
                if (this.name.length < 3 || this.name.length > 50){
                    this.validaMessage.push("The name must have between 3 and 50 characters.")
                }
                if (this.validaMessage.length){
                    this.valida=1;
                }
                return this.valida;
           }
       },  
   }
</script>

这就是它在我的旧版本项目中的显示方式:

我不知道 Vuetify 更新版本从 2.2.11 到 2.4.0 的更改是否会干扰在组件内实现此方法以显示或隐藏验证消息的能力。我正在尝试解决此问题,以避免重复使用 vee-validate 或 vuelidate 等 3rd 方验证服务。会是什么呢?感谢您花时间阅读本文!

【问题讨论】:

  • 我注意到的第一件事 - 你有一个数据属性valida 和一个方法valida。您必须更改其中一个的名称。
  • 好的,我也注意到了这个错误,感谢您指出!虽然现在尽管没有显示方法错误,但它只显示前 4 个错误(而不是点击保存)。
  • 基本上,第一个错误表明您正在调用一些名为initialize 的方法,但该方法未在组件类别中定义。第二个表示您在 v-btn @click 事件上调用无效(不存在的)方法。但是我在您提供的代码中没有看到对它的引用....
  • 这是因为我删除了之前在@click 事件中引用的“初始化”方法,正如您所提到的。我删除了它并用我用于该按钮的当前方法替换它,它现在可以工作了。您可以发布相同的解决方案,以便我可以将其标记为答案。感谢您的帮助!
  • NP!很高兴我能帮上忙!将其作为答案发布,并附上一个小建议:)

标签: javascript html vue.js vuejs2 vuetify.js


【解决方案1】:

总结起来,这些是错误的原因:

  1. 存在同名的数据属性和方法 - valida
  2. v-btn 组件有一个已删除的方法 initialize 提供给 @click 事件。

还有一个小费作为奖励:

您有一个跨越 12 列的v-col&lt;v-col cols="12" sm="12" md="12"&gt;。由于它应该在每个屏幕尺寸上跨越 12 列,因此实际上没有必要为中小型断点定义列跨度。所以在这种情况下,它真的应该只有&lt;v-col cols="12"&gt; - 将为您节省一点文件大小和加载时间。

【讨论】:

  • 感谢您抽出宝贵时间回答,非常有帮助!将考虑您对列的提示! :)
猜你喜欢
  • 2021-09-08
  • 2021-08-19
  • 2018-07-14
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2019-03-05
相关资源
最近更新 更多