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

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

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

一、前言

在"模擬Vue之?dāng)?shù)據(jù)驅(qū)動3"中,我們實(shí)現(xiàn)了為每個對象擴(kuò)展一個$set方法,用于新增屬性使用,這樣就可以監(jiān)聽新增的屬性了。

當(dāng)然,數(shù)組也是對象,也可以通過$set方法實(shí)現(xiàn)新增屬性。

但是,對于數(shù)組而言,通常我們是通過push之類的方法吧。

PS:Vue中明確指出push、pop、shift、unshift、splice、sort、reverse方法為變異方法,可以通過它們監(jiān)聽屬性變化,觸發(fā)視圖更新(詳情見here

下面,我們就一起來實(shí)現(xiàn)這些Array的變異方法吧。

注:我們將Array變異方法實(shí)現(xiàn),也寫在extendObj.js中的,因?yàn)閿?shù)組也是對象嘛。

二、Array變異方法實(shí)現(xiàn)

要實(shí)現(xiàn)這些變異方法,毫無疑問,我們會重寫它們,那在Array.prototype里面重寫嗎?

當(dāng)然不是,這樣不就影響了所有數(shù)組對象的原型鏈了么!

為了避免這種情況,且,我們只是想在監(jiān)聽數(shù)據(jù)對象上繼承這些變異數(shù)組方法,那么細(xì)心的你會發(fā)現(xiàn),其實(shí)與我們在"模擬Vue之?dāng)?shù)據(jù)驅(qū)動3"中實(shí)現(xiàn)$set方法類似了。

首先,我們創(chuàng)建arrKeys對象用于保存需要變異的數(shù)組方法以及恒定對象extendArr,如下:

let arrKeys = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];
const extendArr = [];

接著,就是在extendArr對象上,一一監(jiān)聽arrKeys中的方法了,與$set方法類似,整體結(jié)構(gòu)如下:

!function(){
  arrKeys.forEach(function(key){
    proxyObject(extendArr, key, function(){
      //TODO
    });
  });
}();

注:proxyObject方法其實(shí)核心就是Object.defineProperty,詳見"模擬Vue之?dāng)?shù)據(jù)驅(qū)動3".

接下來,就是實(shí)現(xiàn)核心部分代碼了,重寫這些方法的目的,是為了監(jiān)聽數(shù)據(jù)變化,所以要在方法原有功能不變的情況下,重寫它們,Array.xxx.apply即可實(shí)現(xiàn)原有功能。

且,push、unshift、splice這三個方法可以在原數(shù)組中,新增屬性,故而,我們需要監(jiān)聽新增屬性以及它們的屬性值,這里就和$set方法完全一樣了,通過$Observer,即可利用observe以及convert方法實(shí)現(xiàn)了。

實(shí)現(xiàn)代碼如下:

!function(){
  arrKeys.forEach(function(key){
    proxyObject(extendArr, key, function(){
      console.log('Fun ' + key + ' is observed');
      let result;
      let arrProto = Array.prototype;
      let ob = this.$Observer;
      let arr = arrProto.slice.call(arguments);
      let inserted;
      let index;
      switch(key){
        case 'push': {
          inserted = arr;
          index = this.length;
          break;
        }
        case 'unshift': {
          inserted = arr;
          index = 0;
          break;
        }
        case 'splice': {
          inserted = arr.slice(2);
          index = arr[0];
          break;
        }
      }
      result = arrProto[key].apply(this, arguments);
      if(inserted){
        inserted.forEach(val => {
          ob.observe(val);
          ob.convert(index++, val);
        });
      }
      return result;
    });
  });
}();

最后,就是在需要監(jiān)聽的對象上繼承這些變異方法咯,如下:

//observer.js
function Observer(data){
  if(!(this instanceof Observer)){
    return new Observer(data);
  }
  data.__proto__ = extendObj;
  //繼承變異方法push、pop等等
  if(Array.isArray(data)){
    data.__proto__.__proto__ = extendArr;
  }
  this.data = data;
  this.walk(data);  
}

好了,一切完畢,接下來就測試下唄:

<script src="./extendObj.js"></script>
<script src="./observer.js"></script>
<script>
  'use strict';
  let data = {
    msg: [5, 2, 0],
    user: {
      name: 'Monkey',
      age: 24
    },
    lover: {
      name: 'Dorie',
      age: 23
    }
  };
  Observer(data);
</script>

效果如下:

Perfect,此時,你可能會想,數(shù)組方法中僅有push、unshift、splice會為數(shù)組新增屬性,那么我們又何必將其他方法,例如sort、reverse重寫呢,也沒發(fā)現(xiàn)有什么貓膩呢?

不錯,在此時,并沒有什么卵用,但是,你要知道sort、reverse等這些方法,可是會引起數(shù)組變化的,那么就會影響視圖展現(xiàn),這些變化,又怎么通知數(shù)組呢?就是下篇隨筆會具體說明的。

該篇隨筆代碼,詳情見github.

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

相關(guān)文章

  • Vue + OpenLayers 快速入門學(xué)習(xí)教程

    Vue + OpenLayers 快速入門學(xué)習(xí)教程

    大家都知道使用 Openlayers可以很靈活自由的做出各種地圖和空間數(shù)據(jù)的展示。而且這個框架是完全免費(fèi)和開源的,本文記錄下 Vue 使用 OpenLayers 入門,使用 OpenLayers 創(chuàng)建地圖組件的相關(guān)知識,需要的朋友一起學(xué)習(xí)下吧
    2021-09-09
  • vue2.0項(xiàng)目實(shí)現(xiàn)路由跳轉(zhuǎn)的方法詳解

    vue2.0項(xiàng)目實(shí)現(xiàn)路由跳轉(zhuǎn)的方法詳解

    這篇文章主要介紹了vue2.0項(xiàng)目實(shí)現(xiàn)路由跳轉(zhuǎn)的詳細(xì)方法,非常不錯,具有一定的參考借鑒借鑒價值,需要的朋友可以參考下
    2018-06-06
  • element el-table表格的二次封裝實(shí)現(xiàn)(附表格高度自適應(yīng))

    element el-table表格的二次封裝實(shí)現(xiàn)(附表格高度自適應(yīng))

    這篇文章主要介紹了element el-table表格的二次封裝實(shí)現(xiàn)(附表格高度自適應(yīng)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Vue生命周期深入分析總結(jié)

    Vue生命周期深入分析總結(jié)

    Vue的生命周期就是vue實(shí)例從創(chuàng)建到銷毀的全過程,也就是new?Vue()?開始就是vue生命周期的開始。Vue?實(shí)例有?個完整的?命周期,也就是從開始創(chuàng)建、初始化數(shù)據(jù)、編譯模版、掛載Dom?->?渲染、更新?->?渲染、卸載?等?系列過程,稱這是Vue的?命周期
    2022-08-08
  • vue axios 簡單封裝以及思考

    vue axios 簡單封裝以及思考

    axios 是一個基于Promise 用于瀏覽器和 nodejs 的 HTTP 客戶端。這篇文章主要介紹了vue axios 簡單封裝以及思考 ,需要的朋友可以參考下
    2018-10-10
  • 詳解vuex狀態(tài)管理模式

    詳解vuex狀態(tài)管理模式

    這篇文章主要介紹了詳解vuex狀態(tài)管理模式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • Vue中使用a標(biāo)簽下載靜態(tài)資源文件(如excel、pdf等)純前端操作方法

    Vue中使用a標(biāo)簽下載靜態(tài)資源文件(如excel、pdf等)純前端操作方法

    這篇文章主要介紹了Vue中使用a標(biāo)簽下載靜態(tài)資源文件(如excel、pdf等)純前端操作方法的相關(guān)資料,需要的朋友可以參考下
    2025-02-02
  • 詳解Vue webapp項(xiàng)目通過HBulider打包原生APP(vue+webpack+HBulider)

    詳解Vue webapp項(xiàng)目通過HBulider打包原生APP(vue+webpack+HBulider)

    這篇文章主要介紹了詳解Vue webapp項(xiàng)目通過HBulider打包原生APP(vue+webpack+HBulider),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Vue組件化開發(fā)的必備技能之組件遞歸

    Vue組件化開發(fā)的必備技能之組件遞歸

    組件是可以在它們自己的模板中調(diào)用自身的,不過它們只能通過?name?選項(xiàng)來做這件事,下面這篇文章主要給大家介紹了關(guān)于Vue組件化開發(fā)的必備技能之組件遞歸的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 快速修改antd?vue單個組件的默認(rèn)樣式

    快速修改antd?vue單個組件的默認(rèn)樣式

    這篇文章主要介紹了快速修改antd?vue單個組件的默認(rèn)樣式方式,具有很好的參考價值,希望對大家有所幫助。
    2022-08-08

最新評論

宁晋县| 四川省| 榆林市| 静宁县| 凉山| 商城县| 宜阳县| 庆城县| 光泽县| 武隆县| 黄平县| 东辽县| 青州市| 杨浦区| 龙海市| 突泉县| 丰镇市| 城固县| 定安县| 新密市| 博罗县| 嘉兴市| 五原县| 遂平县| 宜川县| 启东市| 泸州市| 阿坝| 广西| 罗山县| 滁州市| 冀州市| 南溪县| 丘北县| 攀枝花市| 郑州市| 阳江市| 黎城县| 永寿县| 广安市| 麻阳|