この記事では、Proxy を使用して双方向バインディングを実現する方法 (コード) を紹介します。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。
前書き: 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 プロキシを使用して実装する
プロキシを使用する主な原則は、データ値をプロキシする新しい Proxy オブジェクトを作成することです。配列メソッド 操作に関しては、2 つの代入操作があります。1 つは値を追加する操作、もう 1 つはその長さの値を変更する操作です。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 中国語 Web サイトの JavaScript チュートリアル ビデオ 列に注目してください。
以上がProxyを利用して双方向バインディングを実装する方法の紹介(コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。