为什么在这个简单的代码中 Vuex getter 不起作用?
2020-03-24
98
我正在尝试创建一个 JSFiddle,以便我可以试验我在实际应用中遇到的问题,然后希望向其他人展示该 JSFiddle。代码如下,我收到一条错误消息,指出
[Vue warn]: Error in mounted hook: "TypeError: Cannot read property 'length' of undefined"
我做错了什么?
Vue.component('product-info', {
template: '<div> {{Product[0].ProductTitle}} </div>',
computed: {
Product() { return this.$store.getters.getProduct},
},
mounted() {
if (!this.Product.length) {
this.getProduct();
}
},
methods: {
getProduct() {
return this.$store.dispatch('loadProduct')
}
}
});
let ProductData = [{
"ProductID": 101,
"ProductTypeID": 1,
"ProductTitle": "Sony PS4 Pro with Death Standing",
"ProductDescription": "<p>Grab yourself a new console complete with a top title with the Sony PlayStation 4 Pro & Death Stranding Bundle</p>\n <p>Experience the most spectacular graphics on every game and film with the PlayStation 4 Pro – with 4K Ultra HD resolution and HDR compatibility. Twice the power as previous models, the PlayStation 4 Pro achieves faster and more stable frame rates as well as incredibly lifelike details.</p>"
}];
const store = new Vuex.Store({
state: {
Product: []
},
actions: {
loadProduct({
commit
}) {
commit('setProduct', ProductData)
}
},
getters: {
getProduct: (state) => state.Product
},
mutations: {
setProduct(state, ProductData) {
state.Product = ProductData
}
}
})
const app = new Vue({
store,
el: '#app'
})
<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/vuex"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<div id="app">
<product-info></product-info>
</div>
2个回答
您必须将计算属性声明为函数:
computed: {
Product() { return this.$store.getters.getProduct }
}
lukaszmtw
2020-03-24
您错过了从计算变量
返回
它,并且在打印之前在
模板
中检查产品的
长度
。
<div v-if="Product.length">
Vue.component('product-info', {
template: '<div v-if="Product.length"> {{Product[0].ProductTitle}} </div>',
computed: {
Product() { return this.$store.getters.getProduct},
},
mounted() {
if (!this.Product.length) {
this.getProduct();
}
// you need to right some promise to get value from length in your `axios`, eg:
setTimeout(() => { console.log('product length:', this.Product.length)}, 1000)
},
methods: {
getProduct() {
return this.$store.dispatch('loadProduct')
}
}
});
let ProductData = [{
"ProductID": 101,
"ProductTypeID": 1,
"ProductTitle": "Sony PS4 Pro with Death Standing",
"ProductDescription": "<p>Grab yourself a new console complete with a top title with the Sony PlayStation 4 Pro & Death Stranding Bundle</p>\n <p>Experience the most spectacular graphics on every game and film with the PlayStation 4 Pro – with 4K Ultra HD resolution and HDR compatibility. Twice the power as previous models, the PlayStation 4 Pro achieves faster and more stable frame rates as well as incredibly lifelike details.</p>"
}];
const store = new Vuex.Store({
state: {
Product: []
},
actions: {
loadProduct({
commit
}) {
commit('setProduct', ProductData)
}
},
getters: {
getProduct: (state) => state.Product
},
mutations: {
// you need to write your sxios promise here
setProduct(state, ProductData) {
state.Product = ProductData
}
}
})
const app = new Vue({
store,
el: '#app'
})
<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/vuex"></script>
<div id="app">
<product-info></product-info>
</div>
Syed
2020-03-24