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

首頁 > 語言 > JavaScript > 正文

淺析vue 函數配置項watch及函數 $watch 源碼分享

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

Vue雙向榜單的原理

大家都知道Vue采用的是MVVM的設計模式,采用數據驅動實現雙向綁定,不明白雙向綁定原理的需要先補充雙向綁定的知識,在watch的處理中將運用到Vue的雙向榜單原理,所以再次回顧一下:

Vue的數據通過Object.defineProperty設置對象的get和set實現對象屬性的獲取,vue的data下的數據對應唯一 一個dep對象,dep對象會存儲改屬性對應的watcher,在獲取數據(get)的時候為相關屬性添加具有對應處理函數的watcher,在設置屬性的時候,觸發def對象下watcher執行相關的邏輯

// 為data的的所有屬性添加getter 和 setterfunction defineReactive( obj,key,val,customSetter,shallow) {  //  var dep = new Dep();  /*....省略部分....*/  var childOb = !shallow && observe(val); //為對象添加備份依賴dep  Object.defineProperty(obj, key, {    enumerable: true,    configurable: true,    get: function reactiveGetter() {      var value = getter ? getter.call(obj) : val;      if (Dep.target) {        dep.depend(); //         if (childOb) {          childOb.dep.depend(); //依賴dep 添加watcher 用于set ,array改變等使用          if (Array.isArray(value)) {            dependArray(value);          }        }      }      return value    },    set: function reactiveSetter(newVal) {      var value = getter ? getter.call(obj) : val;      /* eslint-disable no-self-compare */      if (newVal === value || (newVal !== newVal && value !== value)) {        return      }      /* eslint-enable no-self-compare */      if ("development" !== 'production' && customSetter) {        customSetter();      }      if (setter) {        setter.call(obj, newVal);      } else {        val = newVal;      }      childOb = !shallow && observe(newVal);      dep.notify();//有改變觸發watcher進行更新    }  });} 

在vue進行實例化的時候,將調用 initWatch(vm, opts.watch);進行初始化watch的初始化,該函數最終將調用 vm.$watch(expOrFn, handler, options) 進行watch的配置,下面我們將講解 vm.$watch方法

Vue.prototype.$watch = function (      expOrFn,      cb,      options    ) {      var vm = this;      if (isPlainObject(cb)) {        return createWatcher(vm, expOrFn, cb, options)      }      options = options || {};      options.user = true;      //為需要觀察的 expOrFn 添加watcher ,expOrFn的值有改變時執行cb,      //在watcher的實例化的過程中會對expOrFn進行解析,并為expOrFn涉及到的data數據下的def添加該watcher      var watcher = new Watcher(vm, expOrFn, cb, options);      //immediate==true 立即執行watch handler      if (options.immediate) {         cb.call(vm, watcher.value);      }      //取消觀察函數      return function unwatchFn() {        watcher.teardown();      }    };

來看看實例化watcher的過程中(只分享是觀察函數中的實例的watcher)

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

圖片精選

主站蜘蛛池模板: 浦北县| 涞水县| 元谋县| 渑池县| 涡阳县| 涞水县| 苍梧县| 南通市| 陆河县| 环江| 衡山县| 贡觉县| 鹿泉市| 香河县| 仁化县| 舟山市| 武城县| 永嘉县| 东乌珠穆沁旗| 抚州市| 手游| 合川市| 文水县| 靖州| 德阳市| 华蓥市| 石林| 余姚市| 巩义市| 宁乡县| 泾阳县| 波密县| 南康市| 镇平县| 东乌珠穆沁旗| 金山区| 九龙县| 罗平县| 海安县| 清水县| 常熟市|