比较vue3和vue2的数据代理
vue2的响应式
核心
对象:通过defineProperty对对象的已有属性值的读取和修改进行劫持(监视/拦截) 数组:通过重写数组更新数组一系列更新元素的方法来实现元素修改的劫持
Object. defineProperty ( data, 'count' , {
get ( ) { }
set ( ) { }
} )
问题
对象直接新添加的属性或删除已有属性,界面不会自动更新 直接通过下标替换元素或更新length,界面不会自动更新arr[1] = {}
vue3的响应式
核心:
通过Proxy(代理):拦截对data任意属性的任意(13种)操作,包括属性值的读写,属性的添加,属性的删除等… 通过Reflect(反射):动态对被代理对象的相应属性进行特定的操作。 文档:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect
const user = {
name: 'ss' ,
age: 20 ,
wife: {
name: 'xx' ,
age: 19
}
}
const proxyUser = new Proxy ( user, {
get ( target, prop) {
console . log ( 'Get被调用' )
return Reflect. get ( target, prop)
}
set ( target, prop, val) {
console . log ( 'Set被调用' )
return Reflect. set ( target, prop, val)
}
deleteProperty ( target, prop) {
console . log ( 'delet被调用' )
return Reflect. deleteProperty ( target, prop)
}
} )
console . log ( proxyUser. name)
proxyUser. name = 'x65'
proxyUser. gender = '男'