欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于vue中如何監(jiān)聽數(shù)組變化

 更新時間:2021年04月28日 14:26:31   作者:淺笑·  
這篇文章主要介紹了關(guān)于vue中如何監(jiān)聽數(shù)組變化,對vue感興趣的同學(xué),必須得參考下

前言

前段時間學(xué)習(xí)了關(guān)于vue中響應(yīng)式數(shù)據(jù)的原理,(并作了學(xué)習(xí)筆記vue響應(yīng)式原理),其實(shí)是通過Object.defineProperty控制getter和setter,并利用觀察者模式完成的響應(yīng)式設(shè)計(jì)。那么數(shù)組有一系列的操作方法,這些方法并不會觸發(fā)數(shù)組的getter和setter方法。那么vue中針對數(shù)組的響應(yīng)式設(shè)計(jì)是如何實(shí)現(xiàn)的呢...那么我們一起去學(xué)習(xí)下吧~

源碼部分

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

從哪開始第一步學(xué)習(xí)呢

Emmmm...
我覺得要先把Vue中的數(shù)據(jù)響應(yīng)式原理弄清楚,這樣對于理解vue中是如何檢測數(shù)組的變化才比較好,所以,可以去網(wǎng)上找下文章然后配合源碼進(jìn)行閱讀,相信你一定會理解的。推薦下我之前看的一篇博客,還有我看過后自己寫的學(xué)習(xí)記錄吧,哈哈。

vue響應(yīng)式原理

vue的雙向綁定原理和實(shí)現(xiàn)

好的,先看看這個吧。哈哈!

從圖開始

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

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

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

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

是不是很簡單?。?!

看看源碼吧

了解了實(shí)現(xiàn)原理,那么我們再看看源碼吧,看下源碼主要是更深入的了解作者是如何實(shí)現(xiàn)的,也可以看下優(yōu)秀的代碼編碼方式,加以學(xué)習(xí)。

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

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


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

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

//進(jìn)行原型連接,將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) // 原來的數(shù)組方法執(zhí)行結(jié)果
    const ob = this.__ob__ // 這個__ob__就是Observe的實(shí)例~~~~
    let inserted
    switch (method) {
      case 'push':
      case 'unshift':
        inserted = args
        break
      case 'splice':
        inserted = args.slice(2)
        break
    }
    if (inserted) ob.observeArray(inserted) // 如果數(shù)組有變化,則重新調(diào)用observeArray
    // notify change
    ob.dep.notify()  //
    return result
  })
})

這個是關(guān)于Observe的代碼:

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

如下是observeArray的實(shí)現(xiàn):

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
  }

這個是關(guān)于def方法的實(shí)現(xiàn),很簡單我就不說了哈:

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

以上就是關(guān)于vue中如何監(jiān)聽數(shù)組變化的詳細(xì)內(nèi)容,更多關(guān)于vue如何監(jiān)聽數(shù)組的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue中前進(jìn)刷新、后退緩存用戶瀏覽數(shù)據(jù)和瀏覽位置的實(shí)例講解

    vue中前進(jìn)刷新、后退緩存用戶瀏覽數(shù)據(jù)和瀏覽位置的實(shí)例講解

    今天小編就為大家分享一篇vue中前進(jìn)刷新、后退緩存用戶瀏覽數(shù)據(jù)和瀏覽位置的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue elementui字體圖標(biāo)顯示問題解決方案

    Vue elementui字體圖標(biāo)顯示問題解決方案

    這篇文章主要介紹了Vue elementui字體圖標(biāo)顯示問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • vue-cli監(jiān)聽組件加載完成的方法

    vue-cli監(jiān)聽組件加載完成的方法

    今天小編就為大家分享一篇vue-cli監(jiān)聽組件加載完成的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • 解決VUEX刷新的時候出現(xiàn)數(shù)據(jù)消失

    解決VUEX刷新的時候出現(xiàn)數(shù)據(jù)消失

    這篇文章主要介紹了解決VUEX刷新的時候出現(xiàn)數(shù)據(jù)消失,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Vant 中的Toast設(shè)置全局的延遲時間操作

    Vant 中的Toast設(shè)置全局的延遲時間操作

    這篇文章主要介紹了Vant 中的Toast設(shè)置全局的延遲時間操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 使用mockjs如何生成隨機(jī)數(shù)據(jù)

    使用mockjs如何生成隨機(jī)數(shù)據(jù)

    Mockjs是一個用于生成隨機(jī)數(shù)據(jù)和攔截Ajax請求的庫,可以與Vue和Axios結(jié)合使用,提高前端開發(fā)效率,通過在項(xiàng)目中引入Mock.js文件,可以模擬后端API,攔截Ajax請求并返回自定義響應(yīng),這種方法適用于在后端尚未開發(fā)完成時的前端開發(fā)測試
    2024-10-10
  • Vue項(xiàng)目打包部署的實(shí)戰(zhàn)過程記錄

    Vue項(xiàng)目打包部署的實(shí)戰(zhàn)過程記錄

    我們使用nginx部署Vue項(xiàng)目,實(shí)質(zhì)上就是將Vue項(xiàng)目打包后的內(nèi)容同步到nginx指向的文件夾,下面這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目打包部署的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • vue實(shí)現(xiàn)todolist單頁面應(yīng)用

    vue實(shí)現(xiàn)todolist單頁面應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)todolist單頁面應(yīng)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Vue使用axios進(jìn)行數(shù)據(jù)異步交互的方法

    Vue使用axios進(jìn)行數(shù)據(jù)異步交互的方法

    大家都知道在Vue里面有兩種出名的插件能夠支持發(fā)起異步數(shù)據(jù)傳輸和接口交互,分別是axios和vue-resource,同時vue更新到2.0之后,宣告不再對vue-resource更新,而是推薦的axios,今天就講一下怎么引入axios,需要的朋友可以參考下
    2024-01-01
  • Vue中在setup下如何使用自定義指令

    Vue中在setup下如何使用自定義指令

    這篇文章主要介紹了Vue中在setup下如何使用自定義指令,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論