【问题标题】:[Vue warn]: Error in v-on handler: "TypeError: Cannot read properties of undefined[Vue 警告]:v-on 处理程序中的错误:\"TypeError:无法读取未定义的属性
【发布时间】:2022-12-20 16:58:25
【问题描述】:

尝试将数据发布到集合(使用 Vue (2.6.11)、Vuetify (2.4.0)、Vuex (3.6.2)、Vue-router (3.5.1)、Axios)但出现此错误。一直无法修复它,不确定为什么它不起作用。

添加项目表单(AddItem.vue):

                <v-form ref="form" v-model="valid">
                    <v-text-field name="title" v-model="form.title" label="title" required>
                    </v-text-field>

                    <v-text-field name="description" v-model="form.description" label="Item Description" required>
                    </v-text-field>

                    <v-select name="categoryID" v-model="form.category" :items="categories" item-text="name" item-value="_id" label="Category" required>
                    </v-select>

                    <v-select name="qualityID" v-model="form.quality" :items="qualities" item-text="name" item-value="_id" label="Quality" required>
                    </v-select>

                    <v-text-field name="price" v-model="form.price" label="Price" required>
                    </v-text-field>

                    <v-file-input name="photo" v-model="form.photo" multiple label="Item photo(s)">
                    </v-file-input>

                    <v-btn rounded text :disabled="!valid" @click="addItem()">
                                Add
                            </v-btn>

                    <v-btn @click="reset">
                        Reset Form
                    </v-btn>
                </v-form>

<script>
    import GoBack from '@/components/GoBack'

    export default {
        name: "addItem",
        data: () => ({
            form: {
                title: "",
                description: "",
                category: "",
                quality: "",
                price: ""
            },
            categories: [
                { _id: "620a6acaff3f5cebc8370121", name: 'Food' },
                { _id: "620a6ae3ff3f5cebc8370123", name: 'Clothes' },
                { _id: "620a6af1ff3f5cebc8370125", name: 'Furniture' },
                { _id: "620a6b04ff3f5cebc8370127", name: 'Electronics' },
                { _id: "620a7a0fded499a220f386d1", name: 'Tools' },
                { _id: "620a7ca7178dada11844dbad", name: 'Toys' }
            ],
        }),
        methods: {
            addItem() {
                if (this.$refs.form.validate()) {
                    this.$store.dispatch('addItem', this.form)
                }
            }
        }
    };
</script>

商店.js:

import Vue from 'vue'
import Vuex from 'vuex'
import axios from '@/config'
import router from '@/router'

Vue.use(Vuex)

export default new Vuex.Store({
  
  actions: {
    addItem() {
      axios
        .post(`/items`, {
          title: this.form.title,
          description: this.form.description,
          categoryID: this.form.category,
          qualityID: this.form.quality,
          price: this.form.price
        })
        .then(response => {
          console.log(response.data)
        })
        .catch(error => {
          console.log(error)
          console.log(error.response.data.message)
          router.push('/items').catch(() => {});
        })
    }
  }
})

错误:

错误中的“标题”专门引用了“this.store.title”中的“标题”(例如,如果我将其更改为“this.store.title1”,错误将开始引用“title1”),我以为我不知道看不出有什么问题,也找不到任何解决办法。如果有人知道我如何解决这个问题,我将不胜感激,如果我能提供更多信息,请告诉我,感谢您抽出时间。

【问题讨论】:

    标签: javascript vue.js axios vuetify.js vue-router


    【解决方案1】:

    在您的商店中,您正在尝试使用未定义的 this.form。而不是使用 this.form 你必须使用一个参数。您已经在此处将参数传递给您的操作 this.$store.dispatch('addItem', this.form),因此在这方面没有什么可做的,但您没有使用它。

    import Vue from 'vue'
    import Vuex from 'vuex'
    import axios from '@/config'
    import router from '@/router'
    
    Vue.use(Vuex)
    
    export default new Vuex.Store({
      
      actions: {
        addItem({},form) {
          axios
            .post(`/items`, {
              title: form.title,
              description: form.description,
              categoryID: form.category,
              qualityID: form.quality,
              price: form.price
            })
            .then(response => {
              console.log(response.data)
            })
            .catch(error => {
              console.log(error)
              console.log(error.response.data.message)
              router.push('/items').catch(() => {});
            })
        }
      }
    })
    

    【讨论】:

    • 感谢您的回复,我尝试了您推荐的更改,但它在代码编辑器中给我警告。它表示“{}”是一个意外的空对象模式,并且声明了“form”但从未读取该值。它也不会在浏览器中运行并给出错误:'unexpected empty object pattern' and ''from' is defined but never used'
    • 对不起,我的错误,我没有删除“这个”。从邮政领域。它现在成功地尝试发布到数据库,但是我有一些其他错误阻止了我需要查看的项目的实际添加
    • 由于某种原因,表单中的信息没有到达发布请求。它不会让我发帖,因为标题和描述等某些字段是必需的,但如果我在后端删除所需的标签,它会发布到集合中,但没有来自表单的任何信息,只创建一个空项目一个 _id 字段
    • 你能看看你的浏览器开发工具并检查浏览器是否发送正确的正文吗?这样我们就可以确定问题是在前端还是在后端。
    • 如果我去网络和有效载荷,我会看到一个空体作为有效载荷。那是你要找的吗?我几乎可以肯定这是前端的问题,如果我使用 REST 客户端访问后端,一切正常
    【解决方案2】:

    抱歉,我也有这样的问题。

    错误 [Vue 警告]:事件“selectRole”的无效处理程序:未定义 13:38:41

    在发现

    ---> <Select>
           <ASelect>
             <ACol>
               <ARow>
                 <AFormItem>
                   <AForm>
                     <Pages/register.vue> at pages/register.vue
                       <Nuxt>
                         <Layouts/userLogin.vue> at layouts/userLogin.vue
                           <Root>
    

    【讨论】:

      最近更新 更多