vue2.0和vue3.0双向绑定的实现原理

本文探讨了Vue2.0中通过Object.defineProperty实现的数据劫持,指出了其存在的克隆数据、遍历属性和无法监听数组变化等问题。而Vue3.0引入了Proxy,能直接监听对象和数组变化,简化了数据绑定的实现。通过示例代码展示了Proxy在数据劫持和监听方面的优势。
摘要由CSDN通过智能技术生成

vue2.0的双向数据绑定其实就是用了es5新增加的Object.defineProperty来进行数据劫持的

<span id="spanName"></span>
<input type="text" id="inputName">
let obj = { name : '' };
let newObj = Object.parse(Object.stringify(obj)); // 深拷贝

Object.defineProperty(obj,'name',{ //数据拦截obj里面的name属性
    get(){
        return newObj.name; //这里不能return obj.name 因为这样算获取会重新执行get方法造成死循环,只能用新变量
    }
    set(val){
    	if(val === newObj.name) return;
    	newObj.name = val;
    	observer();
	}
})
// 监听方法
function observer() {
    spanName.innerHtml = obj.name;
    inputName.value = obj.name;
}
inputName.oninput = function(){
    obj.name = this.value;
}

存在的问题:

1.数据劫持时需要对原始数据进行克隆

2.需要分别给对象中的每一个属性设置监听(所以必须遍历对象的每个属性)

3.不能监听数组的变化

 

vue3.0运用的是es6的proxy来进行数据劫持的

let obj = {};
obj = new Proxy(obj,{ //拦截这个对象obj
    get(target,prop){ //target就是拦截的对象obj,prop是对象属性
        return target[prop];
    }
    set(target,prop,value){ // 设置的value值
    	target[prop] = value;
    	observer();
	}
})
// 监听方法
function observer() {
    spanName.innerHtml = obj.name;
    inputName.value = obj.name;
}
inputName.oninput = function(){
    obj.name = this.value; //赋值
}

proxy可以直接监听对象而非属性,可以直接监听数组的变化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值