抛出问题:当 $store.state.topicList变更时,哪种方式实现view更新
1、data(){
return {
topicList: this.$store.state.topicList
}
},
topicList 不会因 Vuex 中管理的 state.topicList 的修改而变化
2、 computed:{
topicList(){
return this.$store.state.topicList
}
}
}
这种方式 topicList 会变化
data 中的内容只会在 created 钩子触发前初始化一次,类似于你直接写 const data = { foo: 123 } 这样,这时属性的值是纯粹的字面量,JS 字面量赋值后显然不会自动更新
先看个简单例子:
let b = ‘xxx’
let a = b
b = ‘xyz’ // 这时对于原始类型,a 肯定还是 ‘xxx’
换句话说,data 中内容依赖变更时,data 属性不会变更(它的设计目标就是保存组件的局部状态数据而已)。而 computed 则是通过【依赖追踪】实现的,在 computed 求值时引用的 Vue 变量变化时,会触发对 computed 的重新计算。
vue的双向绑定机制:简单来说,就是劫持一个属性的赋值方法setter,并触发相应的视图更新。
watch实现view更新机制:观察 Vue 实例变化(data) 中内容变更时,更新view
set、computed实现view更新机制:不仅观察 Vue 实例变化(data) 中内容变更,而且追踪data属性依赖的内容进行观察,内容有变更时更新view
上面的问题就像这个例子一样,变量 b 值的变化并不会使 变量a的属性变化,所以使用watch不会是view更新,但是computed追踪到 b 值的变化时,也使view更新
讲得不够清晰,可参考文献https://segmentfault.com/q/1010000009696383