91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue中怎么監聽數組變化

發布時間:2021-04-29 14:08:28 來源:億速云 閱讀:193 作者:小新 欄目:開發技術

這篇文章主要介紹了vue中怎么監聽數組變化,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

vue是什么

Vue是一套用于構建用戶界面的漸進式JavaScript框架,Vue與其它大型框架的區別是,使用Vue可以自底向上逐層應用,其核心庫只關注視圖層,方便與第三方庫和項目整合,且使用Vue可以采用單文件組件和Vue生態系統支持的庫開發復雜的單頁應用。

從圖開始

咱們先看下下面的圖,先了解下vue中實現的思路,這樣接下來再看源碼的實現,會一清二楚,明明白白。

vue中怎么監聽數組變化

看到這個圖然后思考一下,是不是大致了解了~

首先判斷瀏覽器是否支持__proto__指針

重寫數組的這7個方法,然后根據是否支持__proto__,將改寫后的數組指向數組的prototype。

是不是很簡單!!!

看看源碼吧

了解了實現原理,那么我們再看看源碼吧,看下源碼主要是更深入的了解作者是如何實現的,也可以看下優秀的代碼編碼方式,加以學習。

關于一些解釋我就寫在下面的代碼塊中了哈!

//https://github.com/vuejs/vue/blob/dev/src/core/observer/array.js


//def方法是基于Object.defineProperty封裝的一層方法,很簡單,我會在下面把代碼貼出來,免得大家去找了。
import { def } from '../util/index' 

//保存下原生的數組原型對象
const arrayProto = Array.prototype

//進行原型連接,將arrayMethods的原型指向Array.prototype
export const arrayMethods = Object.create(arrayProto)

const methodsToPatch = [
  'push',
  'pop',
  'shift',
  'unshift',
  'splice',
  'sort',
  'reverse'
]

methodsToPatch.forEach(function (method) {
  // 緩存原生的方法
  const original = arrayProto[method]
  def(arrayMethods, method, function mutator (...args) {
    var args = [], 
    len = arguments.length;
    while (len--) args[len] = arguments[len];
    const result = original.apply(this, args) // 原來的數組方法執行結果
    const ob = this.__ob__ // 這個__ob__就是Observe的實例~~~~
    let inserted
    switch (method) {
      case 'push':
      case 'unshift':
        inserted = args
        break
      case 'splice':
        inserted = args.slice(2)
        break
    }
    if (inserted) ob.observeArray(inserted) // 如果數組有變化,則重新調用observeArray
    // notify change
    ob.dep.notify()  //
    return result
  })
})

這個是關于Observe的代碼:

var Observer = function Observer(value) {
    this.value = value;
    this.dep = new Dep();
    this.vmCount = 0;
    def(value, '__ob__', this);  //這里會看到在每個對象數據上都會綁定一個Observe的實例,所以上面代碼中的this.__ob__就是這個
    if (Array.isArray(value)) { // 這里判斷是否是數組類型的數據,如果是的話就走observeArray
      if (hasProto) {
        protoAugment(value, arrayMethods);
      } else {
        copyAugment(value, arrayMethods, arrayKeys);
      }
      this.observeArray(value); //這里就是處理數組類型的數據,如下
    } else {
      this.walk(value);
    }
  };

如下是observeArray的實現:

Observer.prototype.observeArray = function observeArray(items) {
    for (var i = 0, l = items.length; i < l; i++) {
      observe(items[i]); // 這個observe方法如下
    }
  };

在這里我們看下observe這個方法:

function observe(value, asRootData) {
    if (!isObject(value) || value instanceof VNode) {
      return
    }
    var ob;
    if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
      ob = value.__ob__;
    } else if (
      shouldObserve &&
      !isServerRendering() &&
      (Array.isArray(value) || isPlainObject(value)) &&
      Object.isExtensible(value) &&
      !value._isVue
    ) {
      ob = new Observer(value);
    }
    if (asRootData && ob) {
      ob.vmCount++;
    }
    return ob
  }

這個是關于def方法的實現,很簡單我就不說了哈:

function def (obj, key, val, enumerable) {
    Object.defineProperty(obj, key, {
      value: val,
      enumerable: !!enumerable,
      writable: true,
      configurable: true
    });
}

感謝你能夠認真閱讀完這篇文章,希望小編分享的“vue中怎么監聽數組變化”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东乡族自治县| 合山市| 永泰县| 香格里拉县| 双鸭山市| 乌拉特后旗| 鱼台县| 偏关县| 辽阳县| 宣汉县| 繁昌县| 永昌县| 广州市| 华池县| 铁岭市| 如皋市| 昭通市| 久治县| 桦川县| 海盐县| 武平县| 蒙城县| 西平县| 贡觉县| 班戈县| 武穴市| 天门市| 磐安县| 张家港市| 泗阳县| 武安市| 广宗县| 财经| 三原县| 平舆县| 涿州市| 宣汉县| 德州市| 道孚县| 方山县| 鲁山县|