欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

數(shù)據(jù)觀察

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

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

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 函數(shù)只能將某一個屬性轉(zhuǎn)換為 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])
    }
  }
}

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

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

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

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

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

相關(guān)文章

  • Vue.js?的過濾器你了解多少

    Vue.js?的過濾器你了解多少

    這篇文章主要為大家詳細(xì)介紹了Vue.js?的過濾器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • vue如何判斷dom的class

    vue如何判斷dom的class

    這篇文章主要介紹了vue如何判斷dom的class,vue點擊給dom添加class然后獲取含有class的dom文件,具體內(nèi)容詳情大家參考下本文
    2018-04-04
  • vue2中l(wèi)ess的安裝以及使用教程

    vue2中l(wèi)ess的安裝以及使用教程

    less是css預(yù)處理器,對原先css進(jìn)行了擴(kuò)展和補充,下面這篇文章主要給大家介紹了關(guān)于vue2中l(wèi)ess的安裝以及使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • vue框架制作購物車小球動畫效果實例代碼

    vue框架制作購物車小球動畫效果實例代碼

    最近在學(xué)習(xí)前端制作了一個購物車小球的動畫效果,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友參考下吧
    2019-09-09
  • Vue + Element-ui的下拉框el-select獲取額外參數(shù)詳解

    Vue + Element-ui的下拉框el-select獲取額外參數(shù)詳解

    這篇文章主要介紹了Vue + Element-ui的下拉框el-select獲取額外參數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vuei18n 在數(shù)組中的使用方式

    Vuei18n 在數(shù)組中的使用方式

    這篇文章主要介紹了Vuei18n 在數(shù)組中的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue2之vue.config.js最全配置教程

    vue2之vue.config.js最全配置教程

    本文主要介紹了vue2之vue.config.js最全配置教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • vue-cli的工程模板與構(gòu)建工具詳解

    vue-cli的工程模板與構(gòu)建工具詳解

    vue-cli提供的腳手架只是一個最基礎(chǔ)的,也可以說是Vue團(tuán)隊認(rèn)為的工程結(jié)構(gòu)的一種最佳實踐。這篇文章主要介紹了vue-cli的工程模板與構(gòu)建工具 ,需要的朋友可以參考下
    2018-09-09
  • vue-cli 默認(rèn)路由再子路由選中下的選中狀態(tài)問題及解決代碼

    vue-cli 默認(rèn)路由再子路由選中下的選中狀態(tài)問題及解決代碼

    這篇文章主要介紹了vue-cli 默認(rèn)路由再子路由選中下的選中狀態(tài)問題及解決代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • 關(guān)于vuepress部署出現(xiàn)樣式的問題及解決

    關(guān)于vuepress部署出現(xiàn)樣式的問題及解決

    這篇文章主要介紹了關(guān)于vuepress部署出現(xiàn)樣式的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論