国产探花免费观看_亚洲丰满少妇自慰呻吟_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)

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

圖片精選

主站蜘蛛池模板: 舒城县| 梅河口市| 开远市| 诸城市| 曲松县| 马鞍山市| 横峰县| 连江县| 瓮安县| 定南县| 铁力市| 长泰县| 修武县| 庆阳市| 高雄县| 兰州市| 天门市| 江永县| 宁化县| 望谟县| 新密市| 承德县| 万山特区| 郑州市| 綦江县| 黄骅市| 阿巴嘎旗| 天峨县| 阿坝| 大余县| 沂南县| 左贡县| 常宁市| 封开县| 隆昌县| 广东省| 青龙| 丰台区| 张家口市| 南乐县| 河池市|