每天一个前端小知识02——Vue响应原理

一、Vue2的响应式

实现原理:Object.defineProperty()中get、set方法

Object.defineProperty(data, 'obj', {
    
    
    get () {
    
    }, 
    set () {
    
    }
})

缺点:新增和删除对象属性、通过下标修改数组页面不更新

解决办法:

对象:this.$set(this.obj,'name','beizhen')
	 this.$delete(this.obj,'name')		
	 
数组:this.$set(this.list,0,'beizhen')

二、Vue3响应原理

实现原理:Proxy(代理)对象拦截属性变化,Reflect(反射)操作属性

new Proxy(data, {
    
    
	// 拦截读取属性
    get (target, prop) {
    
    
    	return Reflect.get(target, prop)
    },
    // 拦截设置属性
    set (target, prop, value) {
    
    
    	return Reflect.set(target, prop, value)
    },
    // 拦截删除属性
    deleteProperty (target, prop) {
    
    
    	return Reflect.deleteProperty(target, prop)
    }
})

为什么不用Object操作属性而用Reflect呢?

Reflect更友好,会有返回值;Object异常需要try/catch捕获

猜你喜欢

转载自blog.csdn.net/qq_33591873/article/details/127913339