【发布时间】:2020-03-25 04:38:53
【问题描述】:
我还是 Vue 的新手,并且在连接数据更新后让组件更新其内容的问题。组件将在重新渲染后立即显示更改的内容。
组件
Vue.component('report-summary', {
props: ['translation', 'store'],
watch: {
'store.state.currentModel.Definition': {
handler: function(change) {
console.log('Change detected', change);
},
deep:true
}
},
template: '<div>
'<div class="alert alert-secondary" role="alert">' +
'<h5 class="border-bottom border-dark"> {{ translation.currently_defined }}</h5>' +
'<div>{{ store.state.currentModel.Definition.length }} {{translation.elements }}</div>' +
'</div>' +
'</div>'
});
store 在页面的 HTML 中作为属性传入:
<report-summary :translation="t" :store="store"></report-summary>
store 本身就是一个Vuex.Store:
let store = new Vuex.Store({
state: {
t: undefined,
currentModel: undefined
},
mutations: {
storeNewModel(state) {
let model = CloneFactory.sealedClone(
window.Project.Model.ReportTemplateModel);
model.Header = CloneFactory.sealedClone(
window.Project.Model.ReportTemplateHeaderModel);
state.currentModel = model;
},
storeNewModelDefinition(state, definition) {
state.currentModel.Definition.push(definition);
}
}
});
currentModel 元素通过在模型的Definition 属性中存储任何数据之前调用store.commit('storeNewModel'); 进行初始化。
通过在循环中使用store.commit('storeNewModelDefinition') 来更新定义的内容:
for (let c in this.$data.currentDefinition.charts) {
store.commit('storeNewModelDefinition', c);
}
当store.commit('storeNewModelDefinition', c); 被调用时,商店会按预期更新:
但组件不会对更改的数据做出反应:
然后,当我离开时(通过更改隐藏嵌入式组件的视图)并再次导航到内容已更新的视图:
在控制台窗口中,我看到观察者在任何时候都没有被触发:
我在这里缺少什么?非常感谢您提前睁开眼睛。
使用 EventBus
将watch 切换到事件总线侦听器也没有按计划工作。
这是EventBus的初始化:
window.eventBus= new Vue();
我将此添加到我的组件中:
created: function() {
window.eventBus.$on('report-summary-update', function() {
this.$nextTick(function(){ this.$forceUpdate(); });
});
}
并在从列表中添加或删除元素后发出事件:
window.eventBus.$emit('report-summary-update');
在查看this.$forceUpdate(); 的调试器中设置断点时,我看到它也被调用了,但 UI 仍然会显示旧内容而没有任何更改。我现在真的迷路了。
附注我在Vue forum 上交叉发布了这个,但由于社区很小,希望在这里收到一些反馈。
【问题讨论】:
-
只是出于好奇,您有什么理由不使用
vue-cli这个项目? -
您是否有理由将 Vuex 存储作为属性传递而不是全局访问它?
-
有
CloneFactory.sealedClone(window.Project.Model.ReportTemplateModel);字段Definition返回的对象还是稍后创建? -
如前所述,我还没有真正有机会使用 Vue 做很多事情,所以
vue-cli也是我还没有使用过的东西。一定会检查出来的! @MJ_Wales 我尝试通过window.store...访问模板内的商店,但收到错误消息,提示“窗口未定义”。关于ReportTemplateModel,是的,它包含一个属性“Defitinition”,刚初始化时它是一个空数组。