精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

Vue模擬實現數據驅動的示例分析

這篇文章主要為大家展示了“Vue模擬實現數據驅動的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Vue模擬實現數據驅動的示例分析”這篇文章吧。

十年的江漢網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。網絡營銷推廣的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整江漢建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯公司從事“江漢網站設計”,“江漢網站推廣”以來,每個客戶項目都認真落實執行。

一、前言

之前實現了為每個對象擴展一個$set方法,用于新增屬性使用,這樣就可以監聽新增的屬性了。

當然,數組也是對象,也可以通過$set方法實現新增屬性。

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

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

下面,我們就一起來實現這些Array的變異方法吧。

注:我們將Array變異方法實現,也寫在extendObj.js中的,因為數組也是對象嘛。

二、Array變異方法實現

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

當然不是,這樣不就影響了所有數組對象的原型鏈了么!

為了避免這種情況,且,我們只是想在監聽數據對象上繼承這些變異數組方法,那么細心的你會發現,其實與我們在"模擬Vue之數據驅動3"中實現$set方法類似了。

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

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

接著,就是在extendArr對象上,一一監聽arrKeys中的方法了,與$set方法類似,整體結構如下:

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

注:proxyObject方法其實核心就是Object.defineProperty,詳見"模擬Vue之數據驅動3".

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

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

實現代碼如下:

!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;
    });
  });
}();

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

//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);  
}

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



效果如下:

Vue模擬實現數據驅動的示例分析

以上是“Vue模擬實現數據驅動的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!


網頁名稱:Vue模擬實現數據驅動的示例分析
文章來源:http://m.jcarcd.cn/article/pssddj.html
主站蜘蛛池模板: 精品三级影视亚洲 | 日韩中文字幕在线 | 日韩中文字幕国产 | 国产激情在线不卡 | 日韩精品视频在 | 中文字字幕 | 国产专区91 | 九色精品高 | 国产大片欧美精品 | 精品乱码一区 | 91蝌蚪九色| 精品美女一区 | 日韩午夜特片 | 91成人精品爽啪 | 国产精品1 | 日韩欧美国产另类 | 国产又湿又 | 成人影片在线官网 | 黑人巨大 | 青青草国产成 | 91免费观看网站 | 日韩国产欧美在线 | 91免费入口 | 精品国自产拍视频 | 国产乱妇乱子 | 无码潮喷a片无码高潮快三 无码潮喷中文 | 日本一区高清 | 国产日本韩国视频 | 欧美日韩在线免 | 91传媒| 国产在线乱码 | 中文字幕日韩国产 | 欧美性猛交免费看 | 国产91免费精品电 | 国产不卡六区 | 1区2区3区4区 | 午夜1区| 人人香蕉 | 老妇炕上偷老汉 | 日本很污很黄小 | 哺乳一二区 |