如何解决vue中“TypeError:无法读取未定义的属性‘length’”
我正在尝试创建一个自动下拉菜单来显示类别列表。我正在使用 autocomplete-vue 来创建它。
我收到的错误是
[Vue warn]: Error in mounted hook: "TypeError: Cannot read property 'length' of undefined"
和
TypeError: Cannot read property 'length' of undefined
我不确定如何修复它,即使我的类别正在加载,并且我在自动完成中输入时可以获取我的类别列表,但我在控制台中收到上述错误,所以我不知道如何收到这些错误。
这是我的代码
我的products.js
Vue.component('product-app', require('./ProductApp.vue').default);
Vue.component('product-create', require('./ProductCreate.vue').default);
if (document.getElementById('product-app')) {
const app = new Vue({
el: "#product-app",
data(){
return{
categories: []
}
},
mounted() {
axios.get('/categories').then(response => {
this.categories = response.data;
})
}
});
}
我的products.blade.php
<div id="product-app">
<product-app :categories="categories"></product-app>
</div>
我的 ProductApp.vue
<template>
<div>
<div class="row">
<div class="col-md-6">
<products :products="products"></products>
</div>
<div class="col-md-6">
<product-create v-if="createProduct" :categories="categories"></product-create>
</div>
</div>
</div>
</template>
<script>
export default {
props: ['categories'],
data() {
return {
createProduct: false
}
},
mounted() {
this.bus.$on('create-product', payload => {
this.createProduct = true;
});
}
}
</script>
我的 ProductCreate.vue
<template>
<div>
<div class="row">
<div class="col-lg-6">
<div class="form-control">
<label>Product Name</label>
<input type="text" v-model="product.name" class="form-control">
</div>
<div class="form-control">
<label>Product Description</label>
<textarea v-model="product.description"></textarea>
</div>
<div class="form-control">
<autocomplete-vue v-if="categoriesReady" :list="allCategories"></autocomplete-vue>
</div>
<button class="btn btn-success" @click="saveProduct">Save</button>
</div>
</div>
</div>
</template>
<script>
import AutocompleteVue from 'autocomplete-vue';
export default {
props: ['categories'],
components: {
AutocompleteVue
},
data(){
return{
categoriesReady: false,
allCategories: [],
product: {
name: '',
description: ''
}
}
},
methods: {
getAllCategories(){
for(let i = 0; i < this.categories.length; i++){
let name = this.categories[i].name;
this.allCategories.push({name: name});
}
this.categoriesReady = true;
}
},
mounted(){
this.getAllCategories();
}
}
</script>
仅当我没有从父级传递此组件的“categories”值时,我才会收到该错误消息。 “for(let i = 0; i < this.categories.length; i++)”中的“undefined”对象是“this.categories”。当我传递一个简单的列表时,没有错误消息,控制台很清晰。请再检查一次
我已通过将
axios.get('/categories').then(response => {
this.categories = response.data;
})
从我的product.js
移至我的ProductCreate.vue解决了我的问题,因此我的已安装部分看起来像这样
mounted(){
axios.get('/categories').then(response => {
for(let i = 0; i < response.data.categories.length; i++){
let name = this.categories[i].name;
this.allCategories.push({name: name});
}
this.categoriesReady = true;
})
}
执行此操作后,我的autocomplete-vue可以正常工作,并且我的控制台中没有出现任何错误。
在将此标记为已回答之前,我想知道你们是否可以告诉我这是否是最佳做法。
检查最终安装的函数。
属性长度未定义,因为在循环尝试运行之前,类别尚未从 axios GET 请求返回。尝试通过简单地使用 async around 并使用 await 等待请求(或任何其他您喜欢的解决承诺的方式)来使请求成为承诺。然后类别将在循环运行之前加载。这应该可以解决问题。