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

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

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

一、前言

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

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

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

示意圖如下所示:

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

二、正文

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

首先,當(dāng)數(shù)據(jù)變動,或者觸發(fā)某個事件時,我們需要與變動數(shù)據(jù)關(guān)聯(lián)一個自定義事件(自定義事件詳情見here),如果觸發(fā)某個事件,那么就執(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ù)變動,觸發(fā)自身相關(guān)事件后,怎么一路冒泡到根結(jié)點的處理了。

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

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

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

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

最后,有了子父結(jié)點的依賴關(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é)點是否有父節(jié)點,若有,就向上傳遞事件
 ob && ob.notify(eventName); 
}

Perfect,具體代碼詳見github.

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

相關(guān)文章

  • vue如何讀取本地文件

    vue如何讀取本地文件

    這篇文章主要介紹了vue如何讀取本地文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue3.0使用taro-ui-vue3引入組件不生效的問題及解決

    vue3.0使用taro-ui-vue3引入組件不生效的問題及解決

    這篇文章主要介紹了vue3.0使用taro-ui-vue3引入組件不生效的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue中關(guān)于checkbox使用的問題

    vue中關(guān)于checkbox使用的問題

    這篇文章主要介紹了vue中關(guān)于checkbox使用的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Vue動態(tài)組件實現(xiàn)異常處理方法

    Vue動態(tài)組件實現(xiàn)異常處理方法

    Vue3動態(tài)組件怎么進行異常處理?下面本篇文章帶大家聊聊Vue3 動態(tài)組件異常處理的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • Vue項目在IE瀏覽器頁面白屏且報錯SCRIPT1010:缺少標(biāo)識符問題

    Vue項目在IE瀏覽器頁面白屏且報錯SCRIPT1010:缺少標(biāo)識符問題

    Vue項目在谷歌瀏覽器中正常運行,但在IE瀏覽器中出現(xiàn)問題,如白屏和控制臺報錯,解決過程包括檢查IE設(shè)置、調(diào)整編輯器配置、引入兼容性插件、使用productionSourceMap定位錯誤、檢查插件依賴和版本,以及重新構(gòu)建項目
    2024-09-09
  • Vue.js 2.0窺探之Virtual DOM到底是什么?

    Vue.js 2.0窺探之Virtual DOM到底是什么?

    大家可能聽說Vue.js 2.0已經(jīng)發(fā)布,并且在其中新添加如了一些新功能。其中一個功能就是“Virtual DOM”。那么下面這篇文章就來給大家詳細(xì)介紹Vue.js 2.0中的Virtual DOM到底是什么?需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • Vue監(jiān)聽使用方法和過濾器實現(xiàn)

    Vue監(jiān)聽使用方法和過濾器實現(xiàn)

    這篇文章主要介紹了Vue監(jiān)聽使用方法和過濾器實現(xiàn),過濾器為頁面中數(shù)據(jù)進行強化,具有局部過濾器和全局過濾器
    2022-06-06
  • vue create、vue webpack init創(chuàng)建vue項目產(chǎn)生的項目文件的區(qū)別

    vue create、vue webpack init創(chuàng)建vue項目產(chǎn)生的項目文件的區(qū)別

    這篇文章主要介紹了vue create、vue webpack init創(chuàng)建vue項目產(chǎn)生的項目文件的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Vue如何實現(xiàn)利用vuex永久儲存數(shù)據(jù)

    Vue如何實現(xiàn)利用vuex永久儲存數(shù)據(jù)

    這篇文章主要介紹了Vue如何實現(xiàn)利用vuex永久儲存數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue使用動態(tài)組件實現(xiàn)TAB切換效果

    vue使用動態(tài)組件實現(xiàn)TAB切換效果

    這篇文章主要介紹了vue使用動態(tài)組件實現(xiàn)TAB切換效果的方法,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-05-05

最新評論

资溪县| 武城县| 大港区| 乐陵市| 淄博市| 冀州市| 纳雍县| 达州市| 资溪县| 石嘴山市| 共和县| 泸水县| 临澧县| 密山市| 和顺县| 建始县| 德惠市| 嘉鱼县| 边坝县| 黄骅市| 青冈县| 商水县| 红原县| 金阳县| 封丘县| 什邡市| 益阳市| 九寨沟县| 三河市| 分宜县| 瑞昌市| 三门峡市| 易门县| 阳泉市| 南郑县| 侯马市| 留坝县| 中西区| 龙山县| 克什克腾旗| 治县。|