vue使用Proxy实现双向绑定的方法示例
程序员文章站
2023-12-04 22:25:16
前言:vue3.0要用proxy来实现双向绑定,因此先来尝试一下实现方法。
1 object.defineproperty 实现
原来vue2的实现使用object...
前言:vue3.0要用proxy来实现双向绑定,因此先来尝试一下实现方法。
1 object.defineproperty 实现
原来vue2的实现使用object.defineproperty,监听set,但对于数组直接下标给数组设置值监听不了。
function observe(data) { if (!data || typeof data !== 'object') { return; } // 取出所有属性遍历 object.keys(data).foreach(function(key) { definereactive(data, key, data[key]); }); }; function definereactive(data, key, val) { observe(val); // 监听子属性 object.defineproperty(data, key, { enumerable: true, // 可枚举 configurable: false, // 不能再重写defineproperty get: function() { return val; }, set: function(newval) { console.log('-------通知订阅者--------') val = newval; } }); }
2 使用proxy实现
使用proxy实现原理主要是new一个proxy对象,代理你的data值,需要注意的一点是,对于数组的方法操作来说,会产生两次赋值操作,一次是添加值,一次是改变他的length值,而对于object.defineproperty监听不到的数组下标给数组设置值,proxy是可以监听到的。
function observe(data) { if (!data || typeof data !== 'object') { return; } // 取出所有属性遍历 object.keys(data).foreach(function(_k) { // proxy不允许绑定在非对象上 if (data[_k] && typeof data[_k] === 'object') { data[_k] = definereactive(data[_k]); } }); } function definereactive(data) { return new proxy(data, { set(target, key, value, proxy) { // 进行数组操作时,会进行两次set 一次数据改变,一次length改变,两次改变data的值是不变,因此不应该多分发一次消息 if ( object.prototype.tostring.call(data) === "[object array]" && key === "length" ) { reflect.set(target, key, value, proxy); return true; } observe(data); reflect.set(target, key, value, proxy); console.log('-------通知订阅者--------') return true; } });
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: python比较两个列表大小的方法
下一篇: vue动画效果实现方法示例