当Vuex存储状态发生变化时,如何更新Vue组件属性
How to update Vue component property when Vuex store state changes?
我正在构建一个简单的演示工具,在这里我可以创建演示,命名和添加/删除幻灯片与Vue js和Vuex来处理应用程序的状态。一切都很顺利,但现在我正试图实现一个检测演示文稿变化的功能(标题更改或添加/删除幻灯片),但还没有找到合适的解决方案。为了简单起见,我将只给出有关标题更改的示例。现在在我的Vuex商店我有:
const state = {
presentations: handover.presentations, //array of objects that comes from the DB
currentPresentation: handover.presentations[0]
}
在我的Presentation组件中我有:
export default {
template: '#presentation',
props: ['presentation'],
data: () => {
return {
shadowPresentation: ''
}
},
computed: {
isSelected () {
if (this.getSelectedPresentation !== null) {
return this.presentation === this.getSelectedPresentation
}
return false
},
hasChanged () {
if (this.shadowPresentation.title !== this.presentation.title) {
return true
}
return false
},
...mapGetters(['getSelectedPresentation'])
},
methods: mapActions({
selectPresentation: 'selectPresentation'
}),
created () {
const self = this
self.shadowPresentation = {
title: self.presentation.title,
slides: []
}
self.presentation.slides.forEach(item => {
self.shadowPresentation.slides.push(item)
})
}
}
到目前为止,我所做的是在创建组件时创建演示文稿的影子副本,然后通过计算属性比较我感兴趣的属性(在本例中是标题),如果有任何不同,则返回true。这用于检测更改,但我想做的是能够在保存演示文稿时更新阴影演示文稿,到目前为止我还没有做到这一点。由于savePresentation动作在另一个组件中触发,我真的不知道如何在演示组件中选择"保存"事件,所以我无法更新我的影子演示。关于如何实现这样的功能,有什么想法吗?任何帮助将非常感激!提前感谢! 我最终用一种不同于我在问题中提出的方法来解决这个问题,但它可能会引起一些人的兴趣。它是这样的:
首先,我放弃了让我的vue存储与组件通信事件,因为当你使用vuex时,你应该让所有的应用程序状态由vuex存储管理。我所做的是改变
的表示对象结构{
title: 'title',
slides: []
}
把变成更复杂的东西,比如
{
states: [{
hash: md5(JSON.stringify(presentation)),
content: presentation
}],
statesAhead: [],
lastSaved: md5(JSON.stringify(presentation))
}
,其中presentation
是我最初拥有的简单表示对象。现在我的新表示对象有一个道具states
,我将在其中放置所有的表示状态,每个状态都有一个由字符串化的简单表示对象和实际的简单表示对象生成的哈希值。就像这样,我将为演示文稿中的每次更改生成一个具有不同哈希值的新状态,然后我可以将当前状态哈希值与上次保存的哈希值进行比较。每当我保存演示文稿时,我都会将lastSaved
道具更新为当前状态哈希。有了这个结构,我可以简单地实现撤销/重做功能,只是通过不转移/转移状态从states
到statesAhead
,反之亦然,这甚至比我最初打算的还要多,最后我保留了我所有的状态由vuex存储管理,而不是分散我的状态管理和污染组件。
我希望这不是太混乱,有人觉得这是有帮助的。欢呼声
我在尝试添加新属性到我的用户状态时遇到了这个问题,所以我最终得到了这个,它工作得很好。
Vuex store中的动作
updateUser (state, newObj) {
if (!state.user) {
state.user = {}
}
for (var propertyName in newObj) {
if (newObj.hasOwnProperty(propertyName)) {
//updates store state
Vue.set(state.user, propertyName, newObj[propertyName])
}
}
}
实施从Vue组件调用上面的store操作
this.updateUser({emailVerified: true})
{"user":{"emailVerified":true},"version":"1.0.0"}
- Javascript循环不会自我更新
- 添加文字和评论功能更新Div
- AngularJS:ng之后,重复$scope值未按预期更新
- 如何通过数组更新角度子范围
- Ajax聊天消息重复而不仅仅是更新
- 通过CSV文件上载更新数据库表
- 平均值:无法将数据更新到数据库
- $rootScope未使用forEach进行更新
- d3基于用户选择动态更新节点
- 有条件更新d3.js力图中节点的最佳方法
- Angular:更新一次性绑定的数据
- Javascript更新孙窗口中的表单元素
- 使用AngularJS中的筛选器更新给定的表
- 从选项页面更新chrome扩展清单权限
- 如何在不刷新页面的情况下更新显示框
- 延期承诺值未更新/解析/延期
- 如何在视图模型contet更新更新上调用Jquery函数
- 发布后的应用程序在几分钟后停止更新更新面板
- JSON对象中的数组属性通过foreach更新-更新所有键
- 为什么我可以't更新更新我的JavaScript对象属性值