我是vue的新手,所以我可能会犯一个菜鸟错误。
我有一个root vue元素 - raptor.js:
const Component = {
el: '#app',
store,
data: {
productList: store.state.productlist
},
beforeCreate: function () {
return store.dispatch('getProductList', 'getTrendingBrands');
},
updated: function (){
console.log(111);
startSlider();
}
};
const vm = new Vue(Component);
使用此模板
<div class="grid-module-single popular-products" id="app">
<div class="row">
<div class="popular-items-slick col-xs-12">
<div v-for="product in productList">
...
</div>
</div>
</div>
我的商店很简单:store / index.js:
import Vue from 'vue';
import Vuex from 'vuex';
import model from '../../utilities/model';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
productlist: []
},
mutations: {
setProductList(state, data) {
state.productlist = data;
}
},
actions: {
getProductList({ commit }, action) {
return model.products().then(data => commit('setProductList', data));
}
}
});
在我的vuex devtool中,我可以看到,商店正在更新 https://www.screencast.com/t/UGbw7JyHS3
但我的组件未更新: https://www.screencast.com/t/KhXQrePEd
问题:
我可以从开发工具中看到,我的代码正在运行。商店正在更新数据。但是,我的组件未更新。我认为只需在组件的data属性中添加它就足够了:
data: {
productList: store.state.productlist
}
但显然数据对象似乎没有自动与商店同步。所以我要么在某个地方做一个完整的vue,要么我需要调整一下代码。无论如何,任何人都可以帮助我朝着正确的方向前进。
非常感谢。
答案 0 :(得分:15)
<强>更新强>
自己想出来。只需用计算方法替换组件数据部分:
数据:
data: {
productList: store.state.productlist
}
并将其替换为。
computed: {
productList () {
return store.state.productlist;
}
},
答案 1 :(得分:2)
数据仅在渲染之前在组件上运行一次,因此您可以使用computed代替。 喜欢上面的答案,或者你可以使用mapstate
import {mapstate} from 'vuex'
...
computed: mapstate({
productList: state => state.productList
})
答案 2 :(得分:2)
首先 - 使用getter执行此操作mapGetters
,您还需要以某种方式观看此属性,您可以设置商店订阅或仅使用watch方法槽组件。
this.$store.subscribe((mutation, state) => {
if (mutation.type === 'UPDATE_DATA') {
...
}
}
答案 3 :(得分:-2)
您以错误的方式将商店调用到productList数据属性中。
您可以尝试:
data: {
productList: $store.state.productlist
}
否则,您必须在使用商店的每个组件中导入商店。