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

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

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

前言

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

源碼部分

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

從哪開始第一步學習呢

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

vue響應式原理

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

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

從圖開始

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

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

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

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

是不是很簡單?。?!

看看源碼吧

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

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

//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

//進行原型連接,將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的實例~~~~
    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
  })
})

這個是關于Observe的代碼:

var Observer = function Observer(value) {
    this.value = value;
    this.dep = new Dep();
    this.vmCount = 0;
    def(value, '__ob__', this);  //這里會看到在每個對象數(shù)據(jù)上都會綁定一個Observe的實例,所以上面代碼中的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的實現(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
  }

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

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

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

相關文章

  • Vue2.0用 watch 觀察 prop 變化(不觸發(fā))

    Vue2.0用 watch 觀察 prop 變化(不觸發(fā))

    本篇文章主要介紹了Vue2.0用 watch 觀察 prop 變化(不觸發(fā)),非常具有實用價值,需要的朋友可以參考下
    2017-09-09
  • vue3中使用editor.js的詳細步驟記錄

    vue3中使用editor.js的詳細步驟記錄

    富文本編輯器作為直接與用戶交互的內(nèi)容輸入生產(chǎn)工具,對大家的項目來說非常重要,下面這篇文章主要給大家介紹了關于vue3中使用editor.js的詳細步驟,需要的朋友可以參考下
    2024-01-01
  • ElementUI?$notify通知方法中渲染自定義組件實現(xiàn)

    ElementUI?$notify通知方法中渲染自定義組件實現(xiàn)

    這篇文章主要為大家介紹了ElementUI?$notify通知方法中渲染自定義組件實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • vue中的inject用法及說明

    vue中的inject用法及說明

    這篇文章主要介紹了vue中的inject用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue中組件的數(shù)據(jù)共享分析講解

    Vue中組件的數(shù)據(jù)共享分析講解

    本文章向大家介紹vue組件中的數(shù)據(jù)共享,主要包括vue組件中的數(shù)據(jù)共享使用實例、應用技巧、基本知識點總結(jié)和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下
    2022-12-12
  • VUE對接deepseekAPI調(diào)用方式

    VUE對接deepseekAPI調(diào)用方式

    文章介紹了如何在Vue項目中對接DeepSeek API,包括在開放平臺注冊賬號申請APIKey、安裝axios庫、創(chuàng)建API調(diào)用函數(shù)以及在Vue組件中調(diào)用該函數(shù)
    2025-01-01
  • vue3如何實現(xiàn)單點登錄

    vue3如何實現(xiàn)單點登錄

    這篇文章主要介紹了vue3如何實現(xiàn)單點登錄問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue+ElementUI實現(xiàn)訂單頁動態(tài)添加產(chǎn)品數(shù)據(jù)效果實例代碼

    vue+ElementUI實現(xiàn)訂單頁動態(tài)添加產(chǎn)品數(shù)據(jù)效果實例代碼

    本篇文章主要介紹了vue+ElementUI實現(xiàn)訂單頁動態(tài)添加產(chǎn)品效果實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • vue3中element-plus?Upload上傳文件代碼示例

    vue3中element-plus?Upload上傳文件代碼示例

    這篇文章主要介紹了vue3中element-plus?Upload上傳文件的相關資料,在時間開發(fā)中上傳文件是經(jīng)常遇到的一個需求,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • 解決vue中修改export default中腳本報一大堆錯的問題

    解決vue中修改export default中腳本報一大堆錯的問題

    今天小編就為大家分享一篇解決vue中修改export default中腳本報一大堆錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08

最新評論

金堂县| 钟祥市| 曲阳县| 南召县| 容城县| 北票市| 峨眉山市| 澄城县| 呼和浩特市| 万荣县| 稷山县| 鹿泉市| 兴化市| 章丘市| 怀宁县| 清水河县| 威宁| 土默特右旗| 平罗县| 两当县| 蓝山县| 苏尼特右旗| 湘潭县| 海淀区| 汝阳县| 即墨市| 遵义县| 东乡族自治县| 石景山区| 泽普县| 吴江市| 上思县| 德化县| 紫阳县| 舒兰市| 临湘市| 毕节市| 海南省| 读书| 偏关县| 紫云|