日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解實現vue的數據響應式原理

瀏覽:34日期:2022-10-09 18:42:54

這篇文章主要是給不了解或者沒接觸過 vue 響應式源碼的小伙伴們看的,其主要目的在于能對 vue 的響應式原理有個基本的認識和了解,如果在面試中被問到此類問題,能夠知道面試官想讓你回答的是什么?「PS:文中如有不對的地方,歡迎小伙伴們指正」

響應式的理解

響應式顧名思義就是數據變化,會引起視圖的更新。這篇文章主要分析 vue2.0 中對象和數組響應式原理的實現,依賴收集和視圖更新我們留在下一篇文章分析。

在 vue 中,我們所說的響應式數據,一般指的是數組類型和對象類型的數據。vue 內部通過 Object.defineProperty 方法對對象的屬性進行劫持,數組則是通過重寫數組的方法實現的。下面我們就簡單實現一下。

首先我們定義一個需要被攔截的數據

const vm = new Vue({ data () { return { count: 0, person: { name: ’xxx’ }, arr: [1, 2, 3] } }})let arrayMethodsfunction Vue (options) { // 這里只考慮對 data 數據的操作 let data = options.data if (data) { data = this._data = typeof data === ’function’ ? data.call(this) : data } observer (data)}function observer(data) { if (typeof data !== ’object’ || data === null) { return data } if (data.__ob__) { // 存在 __ob__ 屬性,說明已經被攔截過了 return data } new Observer(data)}

這里的 arrayMethods、Observer 、 __ob__的實現和作用請繼續往下看

實現 Observer 類

class Observer { constructor (data) { Object.defineProperty(data, ’__ob__’, { // 在 data 上定義 __ob__ 屬性,在數組劫持里需要用到 enumerable: false, // 不可枚舉 configurable: false, // 不可配置 value: this // 值是 Observer 實例 }) if (Array.isArray(data)) { // 對數組進行攔截 data.__proto__ = arrayMethods // 原型繼承 this.observerArray(data) } else { // 對象進行攔截 this.walk(data) } } walk (data) { const keys = Object.keys(data) for(let i = 0; i < keys.length; i++) { const key = keys[i] defineReactive(data, key, data[key]) } } observerArray (data) { // 攔截數組中的每一項 data.forEach(value => observer(value)) }}對象的攔截

對象的劫持需要注意的幾點:

遍歷對象,如果值還是對象類型,需要重新調用 observer 觀測方法 如果設置的新值是對象類型,也需要被攔截

// 處理對象的攔截function defineReactive(data, key, value) { observer(value) // 如果 value 值仍是對象類型,需要遞歸劫持 Object.defineProperty(data, key, { get() { return value }, set(newValue){ if (newValue === value) return value = newValue observer(newValue) // 如果設置 newValue 值也是對象類型,需要被劫持 } })}數組的劫持

數組的劫持需要注意的幾點:

數組是使用函數劫持(切片編程)的思想,對數據進行攔截的 數組里新增加的值,如果是對象類型,也需要被重新攔截

const oldArrayPrototype = Array.prototypearrayMethods = Object.create(oldArrayPrototype)const methods = [’push’, ’pop’, ’shift’, ’unshift’, ’splice’, ’sort’, ’reverse’] // 能夠改變原數組的方法methods.forEach(method => { arrayMethods[methods] = function (...args) { const result = oldArrayPrototype[methods].call(this, ...args) const ob = this.__ob__ // this 就是調用改方法的數組 let inserted; // 數組新增的項的集合,需要再對其進行攔截 switch(methods) { case ’push’: case ’unshift’: inserted = args case ’splice’: inserted = args.slice(2) // 因為 splice 第二個參數后面的才是新增的 } if (inserted) { ob.observerArray(inserted) } return result }})原理總結

在面試中,如果我們需要手寫 vue 的響應式原理,上面的代碼足矣。但是我們通過學習 vue 的源碼,如果在面試中能夠給出以下加以總結性的回答更能得到面試官的青睞。

vue 2.0 源碼的響應式原理:

因為使用了遞歸的方式對對象進行攔截,所以數據層級越深,性能越差 數組不使用 Object.defineProperty 的方式進行攔截,是因為如果數組項太多,性能會很差 只有定義在 data 里的數據才會被攔截,后期我們通過 vm.newObj = ’xxx’ 這種在實例上新增的方式新增的屬性是不會被攔截的 改變數組的索引和長度,不會被攔截,因此不會引起視圖的更新 如果在 data 上新增的屬性和更改數組的索引、長度,需要被攔截到,可以使用 $set 方法 可以使用 Object.freeze 方法來優化數據,提高性能,使用了此方法的數據不會被重寫 set 和 get 方法

vue 3.0 源碼響應式原理:

3.0 版本中使用了 proxy 代替了 Object.defineProperty ,其有13中攔截方式,不需要對對象和數組分別進行處理,也無需遞歸進行攔截,這也是其提升性能最大的地方 vue 3.0 版本響應式原理的簡單實現

const handler = { get (target, key) { if (typeof target[key] === ’object’ && target[key] !== null) { return new Proxy(target[key], handler) } return Reflect.get(target, key) }, set (target, key, value) { if(key === ’length’) return true console.log(’update’) return Reflect.set(target, key, value) }}const obj = { arr: [1, 2, 3], count: { num: 1 }}// obj 是代理的目標對象, handler 是配置對象const proxy = new Proxy(obj, handler)

到此這篇關于詳解實現vue的數據響應式原理的文章就介紹到這了,更多相關vue 數據響應式內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产在线不卡一区二区三区| 国产丝袜一区| 国产精品久久久久久久久久齐齐 | 91国语精品自产拍| 9999国产精品| 精精国产xxxx视频在线野外| 亚洲va中文在线播放免费| 久久免费大视频| 爽好多水快深点欧美视频| 美女精品一区| 亚洲精品欧洲| 亚洲一区二区成人| 婷婷久久免费视频| 精品资源在线| 国户精品久久久久久久久久久不卡| 韩日一区二区三区| 好看的亚洲午夜视频在线| 亚洲毛片网站| 国产精品成人国产| 久久国产电影| 中文字幕日韩欧美精品高清在线| 日韩精品一二三| 国产精品视频3p| 久久久久久美女精品| 水蜜桃久久夜色精品一区的特点| 日韩精品一区二区三区免费视频 | 久久久亚洲一区| 国产精品xvideos88| 乱一区二区av| 欧美精品导航| 久久国产影院| 青草av.久久免费一区| 91免费精品| 少妇高潮一区二区三区99| 国产欧洲在线| 91精品麻豆| 在线日韩一区| 欧美黄页在线免费观看| 欧美粗暴jizz性欧美20| 91成人精品在线| 亚洲美洲欧洲综合国产一区| 久久精品资源| 国产毛片精品久久| 久久亚洲图片| 国产剧情在线观看一区| 一区二区视频欧美| 91亚洲成人| 国产调教精品| 日韩超碰人人爽人人做人人添| 狠狠操综合网| 日韩**一区毛片| 伊人久久视频| 久久天堂成人| 国产一区观看| 精品亚洲美女网站| 久久这里只有| 日本午夜精品久久久久| 蜜桃视频一区二区| 99国产精品| 亚洲天堂av影院| 国产欧美日韩在线一区二区| 日韩视频一二区| 欧美伊人影院| 精品亚洲精品| 亚洲久久视频| 日韩av一级片| 日本视频一区二区| 国产日韩中文在线中文字幕 | 国产精品久久久久久久免费观看 | 成人羞羞视频播放网站| 日韩三区在线| 亚洲二区三区不卡| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲天堂久久| 天堂av一区| 国产精品成人一区二区网站软件| 国产精品**亚洲精品| 国内精品美女在线观看| 亚洲四虎影院| 蜜桃久久久久久| 国产精品白丝一区二区三区| 91视频一区| 亚洲一区日韩在线| 97久久精品| 乱一区二区av| 黄色国产精品| 欧美精品影院| 国产v日韩v欧美v| 尹人成人综合网| 欧美日韩一区二区三区四区在线观看 | 亚洲成人不卡| 老色鬼久久亚洲一区二区| 国产精品嫩模av在线| 日韩国产一区二区三区| 久久久9色精品国产一区二区三区| 91成人网在线观看| 国产精品伦一区二区| 欧美影院三区| 精品欧美视频| 一区二区三区午夜视频| 国产精品蜜芽在线观看| 日韩精品久久久久久久软件91| 欧美天堂视频| 国产精品chinese| 中文视频一区| 精品日韩视频| 精品欧美日韩精品| 日本视频在线一区| 国产午夜久久| 国产一区二区三区精品在线观看| 在线免费观看亚洲| 久久人人99| 日本韩国欧美超级黄在线观看| 免费亚洲婷婷| 国产乱码精品一区二区亚洲| 亚洲一区二区三区无吗| 午夜在线视频观看日韩17c| www成人在线视频| 国产成人久久| 欧美激情另类| 最新中文字幕在线播放 | 一级欧美视频| 欧美1级日本1级| 国产精品亚洲一区二区三区在线观看| 国产视频一区二区在线播放| 亚洲精品中文字幕99999| 丝袜国产日韩另类美女| 午夜一级久久| 日韩欧美美女在线观看| 日本中文字幕一区二区视频 | 久久国产电影| 99国产精品视频免费观看一公开| 极品日韩av| 午夜宅男久久久| 婷婷精品在线观看| 久久xxx视频| 国产精选久久| 精品九九久久| 久久久久国产精品一区二区| 日韩精品欧美激情一区二区| 亚洲国产影院| 亚洲毛片网站| 精品香蕉视频| 国户精品久久久久久久久久久不卡 | 午夜在线视频一区二区区别| 在线日韩成人| 久久精品97| 最新中文字幕在线播放| 久久中文亚洲字幕| 亚洲天堂av资源在线观看| 国产日韩精品视频一区二区三区| 精品久久不卡| 欧美网站在线| 久久超级碰碰| 午夜影院欧美| 久久天堂影院| 日韩精品一区第一页| 久久精品女人| 中文字幕av亚洲精品一部二部| 精品视频网站| 一区二区国产精品| 久久99影视| 亚洲国产成人精品女人| 三级久久三级久久久| 午夜av成人| 另类小说一区二区三区| 日韩在线一区二区| 深夜福利视频一区二区| 日韩一区二区三区四区五区| 国产成人免费精品| 亚洲精品乱码久久久久久蜜桃麻豆| 国产不卡精品| 亚洲区国产区| 丝袜av一区| 久久爱www成人| 婷婷五月色综合香五月| 国产h片在线观看| 欧美日韩一区二区三区不卡视频| 日韩电影免费网址| 欧美激情91| 青草av.久久免费一区| 亚洲国产日韩欧美在线| 日韩免费av| 精品三级av| 久久久久黄色| 国产日韩亚洲| 日韩精品一区二区三区av| 免费观看日韩电影| 黄毛片在线观看| 国产亚洲高清在线观看| 日韩1区2区3区| 美女日韩在线中文字幕| 99久久www免费| 免费污视频在线一区| 久久久久九九精品影院| 欧美aⅴ一区二区三区视频| 欧美亚洲tv| 91精品尤物| 久久99精品久久久野外观看| 国产乱子精品一区二区在线观看|