国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

vue使用Proxy實現雙向綁定的方法示例

2024-05-06 15:41:30
字體:
來源:轉載
供稿:網友

前言: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;  } });

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持錯新站長站。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 额济纳旗| 紫阳县| 澎湖县| 本溪| 普宁市| 大邑县| 富宁县| 建水县| 汶上县| 梨树县| 汉沽区| 横山县| 兴业县| 镇江市| 温泉县| 治县。| 农安县| 旬邑县| 克山县| 锦屏县| 青浦区| 德格县| 平山县| 黄山市| 田东县| 普格县| 教育| 姜堰市| 商丘市| 普兰县| 杭锦后旗| 鹤壁市| 阿坝县| 札达县| 宁津县| 东海县| 治多县| 洛阳市| 昌平区| 张家界市| 阿城市|