数据的响应式原理
基本步骤
Proxy拦截值
跟踪更改它的函数
:我们在 Proxy 中的 getter
中执行此操作,称为 effect
触发函数以便它可以更新最终值
:我们在 Proxy 中的 setter
中进行该操作,名为 trigger
深入原理- 把一个普通的 JavaScript 对象作为 data 选项传给应用或组件实例
- vue会使用带有getter和setter的处理程序遍历其所有property并将其转换为Proxy(ie : Object.defineProperty。但是Proxy 版本更精简,同时提升了性能。)
const target: {
width: 200,
background: 'white'
}
const handler = {
get(target, prop, receiver {
...
return Reflect.get(...arguments)
}
}
const proxiedObj = new Proxy(target, handler)
proxiedObj: {
width: 200,
background: 'white'
}
const handler = {
get(target, prop, receiver) {
track(target, prop)
return Reflect.get(...arguments)
}
}
const handler = {
get(target, prop, receiver) {
track(target, prop)
return Reflect.get(...arguments)
},
set(target, key, value, receiver) {
trigger(target, key)
return Reflect.set(...arguments)
}
}
const handler = {
get(target, prop, receiver) {
track(target, prop)
const value = Reflect.get(...arguments)
if (isObject(value)) {
return reactive(value)
} else {
return value
}
}
}
- 最后:每个组件都有一个相应的侦听器实例,该实例将在组件渲染期间把触碰的左右property记录为依赖项,之后当触发依赖项的setter时,就会通知侦听器,从而使得组件重新渲染
- 问题:被代理对象和原始对象不相等(===)
const obj = {}
const wrapped = new Proxy(obj, handlers)
console.log(obj === wrapped)