我想在我的一个Vue文件中有一个小的注册表,并决定使用Vue提供的Vue.observable函数(是的,我可以使用Vuex,但首先我想尝试一下)。现在,当我在创建后将属性添加到注册表中时(当然使用Vue.set),我发现属性的反应性很难预测:
const state = Vue.observable({fromObservable: ''})
...
computed:
fromObservable: () => state.fromObservable
...
In mounted:
state.fromObservable = 'Success'
const state = Vue.observable({})
...
computed:
fromObservable: () => state.fromObservable
...
In mounted:
Vue.set(state, 'fromObservable', 'Success')
const state = Vue.observable({values: {}})
...
computed:
fromObservable: () => state.values.fromObservable
...
In mounted:
Vue.set(state.values, 'fromObservable', 'Success')
const state = Vue.observable({values: {}}).values
...
computed:
fromObservable: () => state.fromObservable
...
In mounted:
Vue.set(state, 'fromObservable', 'Success')
这里是fiddle的证明。
请向我解释一下,特别是情况2和4的理解方式。
答案 0 :(得分:1)
首先,Vue2使用Object.defineProperty使对象具有反应性
可以肯定地说,不是对象本身就是反应性的,它的属性是
第二个重要事实是计算出的属性:
fromObservable
的{{1}}属性不存在state
undefined
getter是在计算属性中访问的,因此是依赖项state.values
作为参数调用Vue.set
时,它会看到state.values
是反应性属性(Vue添加了setter和getter),因此将新属性的添加注册到对象中像改变一样抱着values
undefined
中访问一次getter(并返回本身没有反应的空对象)幸运的是,由于使用proxies重写了反应性系统-here是为了使用Vue 3重写了代码-在所有情况下都有效! / p>