이 글에서는 프록시를 사용하여 양방향 바인딩을 구현하는 방법(코드)을 소개합니다. 필요한 친구가 참고할 수 있기를 바랍니다.
서문: vue3.0은 Proxy를 사용하여 양방향 바인딩을 구현하므로 먼저 구현 방법을 시도해 보겠습니다.
1 Object.defineProperty 구현
vue2의 원래 구현에서는 Object.defineProperty를 사용하여 집합을 모니터링하지만 배열 설정 값을 직접 첨자로 사용하면 배열을 모니터링할 수 없습니다.
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 프록시를 사용하여 구현
프록시를 사용하는 원칙은 주로 데이터 값을 프록시하기 위해 새 프록시 개체를 만드는 것입니다. 한 가지 주목할 점은 배열의 메서드 작업에 대해 두 가지 할당이 있다는 것입니다. 작업, 하나 값을 추가하고 해당 길이 값을 한 번에 변경하는 것입니다. Object.defineProperty에서 모니터링할 수 없는 배열 첨자의 경우 프록시는 배열 첨자를 모니터링하여 값을 설정할 수 있습니다.
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; } });
이 기사는 여기서 끝났습니다. 더 흥미로운 내용을 보려면 PHP 중국어 웹사이트의 JavaScript Tutorial Video 칼럼을 주목하세요!
위 내용은 프록시를 사용하여 양방향 바인딩을 구현하는 방법 소개(코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!