亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue數(shù)據(jù)驅(qū)動(dòng)模擬實(shí)現(xiàn)5

 更新時(shí)間:2017年01月13日 09:25:55   作者:猴子  
這篇文章主要介紹了Vue數(shù)據(jù)驅(qū)動(dòng)模擬實(shí)現(xiàn)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、前言

在"模擬Vue之?dāng)?shù)據(jù)驅(qū)動(dòng)4"中,我們實(shí)現(xiàn)了push、pop等數(shù)組變異方法。

但是,在隨筆末尾我們提到,當(dāng)pop、sort這些方法觸發(fā)后,該怎么辦呢?因?yàn)槠鋵?shí),它們并沒有往數(shù)組中新增屬性呢。

而且,當(dāng)數(shù)據(jù)改動(dòng)后,如果我們在變動(dòng)數(shù)據(jù)處,就立即更改數(shù)據(jù)也未免性能不夠,此時(shí),走讀Vue源碼,發(fā)現(xiàn)他用了一個(gè)很巧妙的方法,就是職責(zé)鏈模式。當(dāng)某個(gè)數(shù)據(jù)有所變動(dòng)時(shí),它會(huì)向上傳遞,通俗點(diǎn)就是冒泡至根結(jié)點(diǎn),這樣我們也可以在自己代碼中使用事件代理咯,哇卡哇卡。

示意圖如下所示:

好了,說了這么多,我們下面就一起來實(shí)現(xiàn)下吧。

二、正文

注:以下代碼皆編寫在observer.js文件中。

首先,當(dāng)數(shù)據(jù)變動(dòng),或者觸發(fā)某個(gè)事件時(shí),我們需要與變動(dòng)數(shù)據(jù)關(guān)聯(lián)一個(gè)自定義事件(自定義事件詳情見here),如果觸發(fā)某個(gè)事件,那么就執(zhí)行,如下:

綁定事件方法:

//let p = Observer.prototype
p.on = function(eventName, fn){
 let listener = this.listener = this.listener || [];
 if(typeof eventName === 'string' && typeof fn === 'function'){
  if(!listener[eventName]){
   listener[eventName] = [fn];
  }else{
   listener[eventName].push(fn);
  }
 } 
}

取消事件方法:

//let p = Observer.prototype
p.off = function(eventName, fn){
 let listener = this.listener = this.listener || [];
 let actionArray = listener[eventName];
 if(typeof eventName === 'string' && Array.isArray(actionArray)){
  if(typeof fn === 'function'){
   actionArray.forEach( (func, i, arr) => {
    if(func === fn){
     arr.splice(i,1); 
    }
   });
  }
 }
}

觸發(fā)事件方法:

//let p = Observer.prototype
p.emit = function(eventName){
 let listener = this.listener = this.listener || [];
 let actionArray = listener[eventName];
 if(Array.isArray(actionArray)){
  actionArray.forEach( func => {
   if(typeof func === 'function'){
    func(); 
   }
  }); 
 }
}

其次,就是當(dāng)數(shù)據(jù)變動(dòng),觸發(fā)自身相關(guān)事件后,怎么一路冒泡到根結(jié)點(diǎn)的處理了。

怎么冒泡到根結(jié)點(diǎn)呢?

那就自身結(jié)點(diǎn)關(guān)聯(lián)父結(jié)點(diǎn)嘛,這樣不就可以追溯到根節(jié)點(diǎn)了么。

所以,我們在Observer.walk時(shí),就將自己的父節(jié)點(diǎn)記錄即可,如下:

//let p = Observer.prototype
p.observe = function(key, data){
 if(typeof data === 'object'){
  let ob = new Observer(data); 
  //關(guān)聯(lián)父節(jié)點(diǎn)
  ob._parent = {
   key,
   ob: this
  };
 } 
}

最后,有了子父結(jié)點(diǎn)的依賴關(guān)系,那么冒泡方法就OK啦,如下:

//let p = Observer.prototype
p.notify = function(eventName){
 let ob = this._parent && this._parent.ob;
 let key = ob && this._parent.key || 'root';
 console.log('parent--'+key+' event--'+eventName);
 this.emit(eventName);
 //判斷節(jié)點(diǎn)是否有父節(jié)點(diǎn),若有,就向上傳遞事件
 ob && ob.notify(eventName); 
}

Perfect,具體代碼詳見github.

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue常用指令v-if與v-show的區(qū)別淺析

    Vue常用指令v-if與v-show的區(qū)別淺析

    v-if和v-show的區(qū)別是前端面試中常問的基礎(chǔ)知識(shí)點(diǎn),v-if、v-show顧名思義就是用來判斷視圖層展示效果的,下面這篇文章主要給大家介紹了關(guān)于Vue常用指令v-if與v-show區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • vue頁面設(shè)置滾動(dòng)失敗的完美解決方案(scrollTop一直為0)

    vue頁面設(shè)置滾動(dòng)失敗的完美解決方案(scrollTop一直為0)

    這篇文章主要介紹了vue頁面設(shè)置滾動(dòng)失敗的解決方案(scrollTop一直為0),本文通過場景分析實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • vue3實(shí)現(xiàn)CSS無限無縫滾動(dòng)效果

    vue3實(shí)現(xiàn)CSS無限無縫滾動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了vue3實(shí)現(xiàn)CSS無限無縫滾動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • vue+element-ui JYAdmin后臺(tái)管理系統(tǒng)模板解析

    vue+element-ui JYAdmin后臺(tái)管理系統(tǒng)模板解析

    這篇文章主要介紹了vue+element-ui JYAdmin后臺(tái)管理系統(tǒng)模板解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 在Linux服務(wù)器上部署vue項(xiàng)目

    在Linux服務(wù)器上部署vue項(xiàng)目

    這篇文章介紹了在Linux服務(wù)器上部署vue項(xiàng)目的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • vue中解決chrome瀏覽器自動(dòng)播放音頻和MP3語音打包到線上的實(shí)現(xiàn)方法

    vue中解決chrome瀏覽器自動(dòng)播放音頻和MP3語音打包到線上的實(shí)現(xiàn)方法

    這篇文章主要介紹了vue中解決chrome瀏覽器自動(dòng)播放音頻和MP3語音打包到線上的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 利用vue實(shí)現(xiàn)模態(tài)框組件

    利用vue實(shí)現(xiàn)模態(tài)框組件

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)模態(tài)框組件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • vue組件內(nèi)部引入外部js文件的方法

    vue組件內(nèi)部引入外部js文件的方法

    這篇文章主要介紹了vue組件內(nèi)部引入外部js文件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 源碼淺析Vue3中的組件掛載

    源碼淺析Vue3中的組件掛載

    這篇文章主要帶大家從源碼分析一下Vue3中的組件掛載的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-09-09
  • vue3?Table分頁保留選中狀態(tài)代碼示例

    vue3?Table分頁保留選中狀態(tài)代碼示例

    這篇文章主要給大家介紹了關(guān)于vue3?Table分頁保留選中狀態(tài)的相關(guān)資料,vue table組件是一個(gè)非常方便的表格組件,它可以幫助我們實(shí)現(xiàn)分頁和選中功能,需要的朋友可以參考下
    2023-08-08

最新評論