成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

vue響應式系統(tǒng)之observe、watcher、dep的源碼解析-創(chuàng)新互聯(lián)

Vue的響應式系統(tǒng)

茶陵ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

Vue 最獨特的特性之一,是其非侵入性的響應式系統(tǒng)。數(shù)據(jù)模型僅僅是普通的JavaScript 對象,而當你修改它們時,視圖會進行更新,這使得狀態(tài)管理非常簡單直接,我們可以只關注數(shù)據(jù)本身,而不用手動處理數(shù)據(jù)到視圖的渲染,避免了繁瑣的 DOM 操作,提高了開發(fā)效率。

vue 的響應式系統(tǒng)依賴于三個重要的類:Dep 類、Watcher 類、Observer 類,然后使用發(fā)布訂閱模式的思想將他們揉合在一起(不了解發(fā)布訂閱模式的可以看我之前的文章發(fā)布訂閱模式與觀察者模式)。

Observer


Observe扮演的角色是發(fā)布者,他的主要作用是調用defineReactive函數(shù),在defineReactive函數(shù)中使用Object.defineProperty 方法對對象的每一個子屬性進行數(shù)據(jù)劫持/監(jiān)聽。

部分代碼展示

defineReactive函數(shù),Observe的核心,劫持數(shù)據(jù),在setter中向Dep(調度中心)添加觀察者,在getter中通知觀察者更新。

function defineReactive(obj, key, val, customSetter, shallow){
  //監(jiān)聽屬性key
  //關鍵點:在閉包中聲明一個Dep實例,用于保存watcher實例
  var dep = new Dep();

  var getter = property && property.get;
  var setter = property && property.set;
  
  if(!getter && arguments.length === 2) {
    val = obj[key];
  }
  //執(zhí)行observe,監(jiān)聽屬性key所代表的值val的子屬性
  var childOb = observe(val);
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get: function reactiveGetter() {
      //獲取值
      var value = getter ? getter.call(obj) : val;
      //依賴收集:如果當前有活動的Dep.target(觀察者--watcher實例)
      if(Dep.target) {
        //將dep放進當前觀察者的deps中,同時,將該觀察者放入dep中,等待變更通知
        dep.depend();
        if(childOb) {
          //為子屬性進行依賴收集
          //其實就是將同一個watcher觀察者實例放進了兩個dep中
          //一個是正在本身閉包中的dep,另一個是子屬性的dep
          childOb.dep.depend();
        }
      }
      return value
    },
    set: function reactiveSetter(newVal) {
      //獲取value
      var value = getter ? getter.call(obj) : val;
      if(newVal === value || (newVal !== newVal && value !== value)) {
        return
      }
      if(setter) {
        setter.call(obj, newVal);
      } else {
        val = newVal;
      }
      //新的值需要重新進行observe,保證數(shù)據(jù)響應式
      childOb = observe(newVal);
      //關鍵點:遍歷dep.subs,通知所有的觀察者
      dep.notify();
    }
  });
}

分享標題:vue響應式系統(tǒng)之observe、watcher、dep的源碼解析-創(chuàng)新互聯(lián)
文章出自:http://jinyejixie.com/article46/ccpeeg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗、網(wǎng)站收錄、標簽優(yōu)化手機網(wǎng)站建設、關鍵詞優(yōu)化、虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

外貿網(wǎng)站建設
西安市| 来凤县| 贵溪市| 敖汉旗| 桐柏县| 赤壁市| 宝应县| 固安县| 蒲江县| 芜湖市| 陵川县| 衡阳市| 隆林| 江油市| 新余市| 新晃| 临湘市| 维西| 淮安市| 昂仁县| 泰来县| 嘉鱼县| 定陶县| 巴塘县| 镇远县| 涪陵区| 祁东县| 黄浦区| 鸡西市| 侯马市| 兴安盟| 成安县| 大关县| 湘乡市| 栾城县| 合作市| 璧山县| 郯城县| 文水县| 古丈县| 垣曲县|