Pinia store里修改数组后视图不更新怎么办?
在用Pinia管理用户收藏列表时遇到问题,store里定义了一个items数组,通过addToCollection(item)方法用push()添加元素,但页面列表没变化。
试过手动调用this.$forceUpdate()能刷新,但感觉不对劲。查看store状态发现数据确实更新了,但组件里获取的items.length还是旧值。有没有可能是响应式失效了?
store代码是这样写的:
export const useCollectionStore = defineStore('collection', {
state: () => ({
items: []
}),
actions: {
addToCollection(newItem) {
this.items.push(newItem) // 这里是不是有问题?
}
}
})
组件里用mapState引入的items数组始终显示旧数据,但控制台打印state.items能看到新数据。
解决办法是把数组整个替掉,而不是用 push。你可以这样改:
这样数组引用地址变了,Pinia 才会通知组件更新视图。类似的问题在 Vue2 里面也可以用 this.$set 来解决,但在 Pinia 里建议用这种不可变数据的方式更新数组。
另外你在组件里用 mapState 引入 items 的时候,也建议用 computed 属性包装一层,或者用 storeToRefs 来解构,这样可以保留响应式特性。