最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue Object 的變化偵測實現(xiàn)代碼

 更新時間:2020年04月15日 16:28:54   作者:charllote  
這篇文章主要介紹了Vue Object的變化偵測實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

數據觀察

Vue 中的對象變化偵測是通過Object.definePorperty實現(xiàn)的,但是Object.definePorperty的方式有缺陷,比如不能直接代理整個對象,每次都要循環(huán)遍歷對象的所有屬性;尤大大說之后會使用 ES6 中的Proxy 重寫這個部分。這篇博客介紹的是 Object.definePorperty 實現(xiàn)的對象偵測。

我們來看下面這段代碼,定義一個 defineReactive 函數,使用 Object.definePorperty 遍歷對象對象屬性的時候,設置 get 和 set;當對象屬性被讀取的時候觸發(fā) get,對象屬性被設置的時候觸發(fā) set。這樣就完成了對 data 的數據劫持,因為 Vue 的思想是響應式的,我們還需要收集這些變化。

function defineReactive(data,key,val){
  Object.definePorperty(data,key,{
    enumerable: true,
    configurable: true,
    get:function(){
      return val;
    }
    set :function (newVal){
      if(val === newVal){return}
      val = newVal;
    }
  })
}

依賴 收集

創(chuàng)建一個 Dep 類,在 get 中收集依賴,在 set 中新增依賴

class Dep{
  constructor(){
    this.arr = []
  }
  addSub(sub){
    this.arr.push(sub)
  }
   removeSub(sub){
    remove(this.arr,sub)
  }
  depend(){
    if(window.target){
      this.addSub(window.target)
    }
  }
  notify(){
    const arrs = this.arr.slice();
    for(let i = 0; i< arrs.lenth ;i ++){
      arrs[i].update();
    }
  }

}

function defineReactive(data,key,val){

  let dep = new Dep()
  Object.definePorperty(data,key,{
    enumerable: true,
    configurable: true,
    get:function(){
      dep.depend(); // 收集依賴
      return val;
    }
    set :function (newVal){
      if(val === newVal){return}
      val = newVal;
      dep.notify(); // 新增依賴
    }
  })
}

Observer 和 Watcher

我們發(fā)現(xiàn) defineReactive 函數只能將某一個屬性轉換為 get/set 的形式,所以我們需要一個觀察者 Observer 用來幫助遞歸的偵測所有的 key

class Observer{
  constructor(value){
    this.value = value
  }
  if(!Array.isArry(value)){
    this.walk(value)
  }
  walk(obj){
    const keys = Object.keys(obj)
    for(let i = 0; i < keys.length ;i++){
      defineReactive(data,keys[i],obj[keys[i])
    }
  }
}

當這些依賴收集完成之后,我們要通知誰呢?怎么樣能讓視圖知道有變化更新?我們需要實現(xiàn)一個訂閱者 Watcher,
每次觸發(fā) get 的時候都將 dep 指向自己,這樣就可以收集到依賴;
每次 set 的時候都循環(huán)調用 Watcher 的 update 方法。

class Watcher{
  constructor(vm,exp,cb){
    this.vm = vm;
    this.cb = cb;
    this.exp = exp;
    this.value = this.get();
  }
  get(){
    Dep.target = this;  // 將當前訂閱者指向自己
    var value = this.vm[exp];  // 觸發(fā)getter,添加自己到屬性訂閱器中
    Dep.target = null;  // 添加完畢,重置
    return value;
  }
  update(){
    const oldVal = this.value;
    this.value = this.get();
    this.cb.call(this.vm,this.value,oldVal)
  }
}

當 Vue 實例掛載好之后,模板都會綁定一個 Watcher,誰的屬性發(fā)生變化了就會通知響應的 Watcher,Watcher 再去通知編譯器 Compile 進行視圖更新

偵測沒辦法監(jiān)聽到對象上屬性的新增和刪除

Vue 通過Object.definePorperty將對象的 key 轉化為 getter setter 的形式來進行偵測,但是無法追蹤到屬性的新增和刪除,所以 Vue 中提供了 vm.get 來實現(xiàn)

到此這篇關于Vue Object 的變化偵測實現(xiàn)代碼的文章就介紹到這了,更多相關Vue Object 變化偵測 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Vue的編碼技巧與規(guī)范使用詳解

    Vue的編碼技巧與規(guī)范使用詳解

    這篇文章主要介紹了Vue的編碼技巧與規(guī)范使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • 在Vue中實現(xiàn)拖拽功能的實例

    在Vue中實現(xiàn)拖拽功能的實例

    Vue實現(xiàn)拖拽功能的基本原理是監(jiān)聽鼠標事件,實時更新拖拽元素的位置,最后在合適的時機停止拖拽并更新元素位置,在Vue中,我們可以通過綁定相關事件來實現(xiàn)這一功能
    2025-02-02
  • Vue整合AdminLTE模板的方法

    Vue整合AdminLTE模板的方法

    這篇文章主要介紹了Vue整合AdminLTE模板的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • vue中el-tree增加節(jié)點后如何重新刷新

    vue中el-tree增加節(jié)點后如何重新刷新

    這篇文章主要介紹了vue中el-tree增加節(jié)點后如何重新刷新,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue點擊按鈕實現(xiàn)讓頁面的某一個元素全屏展示

    vue點擊按鈕實現(xiàn)讓頁面的某一個元素全屏展示

    這篇文章主要介紹了vue點擊按鈕實現(xiàn)讓頁面的某一個元素全屏展示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 在vue3中安裝使用bootstrap過程

    在vue3中安裝使用bootstrap過程

    這篇文章主要介紹了在vue3中安裝使用bootstrap過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue-router 源碼之實現(xiàn)一個簡單的 vue-router

    vue-router 源碼之實現(xiàn)一個簡單的 vue-router

    這篇文章主要介紹了vue-router 源碼之實現(xiàn)一個簡單的 vue-router,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 解決Antd Table表頭加Icon和氣泡提示的坑

    解決Antd Table表頭加Icon和氣泡提示的坑

    這篇文章主要介紹了解決Antd Table表頭加Icon和氣泡提示的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vue 頁面狀態(tài)保持頁面間數據傳輸的一種方法(推薦)

    Vue 頁面狀態(tài)保持頁面間數據傳輸的一種方法(推薦)

    vue router給我們提供了兩種頁面間傳遞參數的方式,一種是動態(tài)路由匹配,一種是編程式導航,接下來通過本文給大家介紹Vue 頁面狀態(tài)保持頁面間數據傳輸的一種方法,需要的朋友可以參考下
    2018-11-11
  • vue3錨點定位兩種實現(xiàn)方式示例

    vue3錨點定位兩種實現(xiàn)方式示例

    這篇文章主要給大家介紹了關于vue3錨點定位兩種實現(xiàn)的相關資料,說到錨點定位,很多人第一時間會想到 a標簽,但是a標簽實現(xiàn)的錨點定位并不是那么的完美,需要的朋友可以參考下
    2023-07-07

最新評論

利川市| 偏关县| 江城| 青岛市| 荣成市| 榆社县| 邯郸市| 特克斯县| 安远县| 高碑店市| 七台河市| 扎赉特旗| 乌恰县| 太湖县| 汝阳县| 福建省| 乡城县| 尚志市| 治多县| 太康县| 灵武市| 会宁县| 伊春市| 安塞县| 泽库县| 武宣县| 陆良县| 太仓市| 亚东县| 郴州市| 宁南县| 盘锦市| 栾城县| 磐安县| 宁都县| 临颍县| 桐乡市| 浦北县| 库尔勒市| 长乐市| 镇平县|