让Vue响应Map或Set的变化
问题背景
我想在vuex
的state
中使用map
,这样可以使很多操作变得方便
const state = {
all: new Map()
}
这样的写法是没有问题的,不会报错,state.all
可以像正常的Map
一样使用。
但是这里有一个问题,vue的响应式系统不支持Map
和Set
,也就是说,当Map
与Set
里面的元素变化时Vue追踪不到这些变化,因此无法做出响应。这样一来,页面上依赖all
的元素也不会随all
的变化而变化
解决方法
用户”inca”的回答
you need to create a serializable replica of this structure and expose it to Vue
data() {
mySetChangeTracker: 1,
mySet: new Set(),
},
computed: {
mySetAsList() {
var x = this.mySetChangeTracker;
// By using `mySetChangeTracker` we tell Vue that this property depends on it,
// so it gets re-evaluated whenever `mySetChangeTracker` changes
return Array.from(this.mySet);
},
},
methods: {
add(item) {
this.mySet.add(item);
// Trigger Vue updates
this.mySetChangeTracker += 1;
}
}
解决方法是用一个可序列化的mySetChangeTracker
来手动追踪变化
Vue追踪不到Set
的变化,但是可以追踪到mySetChangeTracker
的变化,所以当Set
发生改变后,手动改变mySetChangeTracker
的值就能让Vue知道我的数据发生了变化。
在mySetAsList
里面写入var x = this.mySetChangeTracker
,这样一来当mySetChangeTracker
更新后,mySetAsList
就会做出响应