LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

Vue3中的响应式原理

2022/10/18 vue3

vue2.x的响应式:

实现原理:

对象类型:通过Object.definProperty()对属性的读取、修改进行拦截(数据劫持)。

数组类型:通过重写更新数组的一系列方法来实现拦截(对数组的变更方法进行了包裹)

Objet.defineProperty(data,'count',{
    get(){},
    set(){}
})

存在问题:

新增属性、删除属性,界面不会更新

直接通过下标修改数组,界面不会自动更新

vue3.x的响应式

实现原理:

通过Proxy(代理):拦截对象中任意属性的变化,包括:属性值的读写、属性的增加、属性的删除等

通过Reflect (反射) :对源对象的属性进行操作

模拟vue3中实现响应式

//源数据
let person={
    name:'张三',
    age:18
}
const p=new Proxy(person,{
    //有人读取p的某个属性时调用
    get(target,propName){
    console.log(`有人读取了p身上的${propName}属性`)
    return Reflect.get(target,propName)
    },
    //有人修改p的某个属性、或给p追加某个属性时调用
    set(target,propName,value){
    console.log(`有人修改了了p身上的${propName}属性`)
    Reflect.set(target,propName,value)
    },
    //有人删除p的某个属性时调用
    deleteProperty(target,propName){
    console.log(`有人删除了p身上的${propName}属性`)
    return Reflect.deleteProperty(target,peopName)
    },
})
img_show