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

您的位置:首頁技術(shù)文章
文章詳情頁

vue中是怎樣監(jiān)聽數(shù)組變化的

瀏覽:243日期:2022-11-13 10:50:20

我們知道通過Object.defineProperty()劫持?jǐn)?shù)組為其設(shè)置getter和setter后,調(diào)用的數(shù)組的push、splice、pop等方法改變數(shù)組元素時并不會觸發(fā)數(shù)組的setter,這就會造成使用上述方法改變數(shù)組后,頁面上并不能及時體現(xiàn)這些變化,也就是數(shù)組數(shù)據(jù)變化不是響應(yīng)式的(對上述不了解的可以參考這篇文章)。但實際用vue開發(fā)時,對于響應(yīng)式數(shù)組,使用push、splice、pop等方法改變數(shù)組時,頁面會及時體現(xiàn)這種變化,那么vue中是如何實現(xiàn)的呢?

通過vue源碼可以看出,vue重寫了數(shù)組的push、splice、pop等方法。

// src/core/observer/array.js// 獲取數(shù)組的原型Array.prototype,上面有我們常用的數(shù)組方法const arrayProto = Array.prototype// 創(chuàng)建一個空對象arrayMethods,并將arrayMethods的原型指向Array.prototypeexport const arrayMethods = Object.create(arrayProto)// 列出需要重寫的數(shù)組方法名const methodsToPatch = [ ’push’, ’pop’, ’shift’, ’unshift’, ’splice’, ’sort’, ’reverse’]// 遍歷上述數(shù)組方法名,依次將上述重寫后的數(shù)組方法添加到arrayMethods對象上methodsToPatch.forEach(function (method) { // 保存一份當(dāng)前的方法名對應(yīng)的數(shù)組原始方法 const original = arrayProto[method] // 將重寫后的方法定義到arrayMethods對象上,function mutator() {}就是重寫后的方法 def(arrayMethods, method, function mutator (...args) { // 調(diào)用數(shù)組原始方法,并傳入?yún)?shù)args,并將執(zhí)行結(jié)果賦給result const result = original.apply(this, args) // 當(dāng)數(shù)組調(diào)用重寫后的方法時,this指向該數(shù)組,當(dāng)該數(shù)組為響應(yīng)式時,就可以獲取到其__ob__屬性 const ob = this.__ob__ let inserted switch (method) { case ’push’: case ’unshift’: inserted = args break case ’splice’: inserted = args.slice(2) break } if (inserted) ob.observeArray(inserted) // 將當(dāng)前數(shù)組的變更通知給其訂閱者 ob.dep.notify() // 最后返回執(zhí)行結(jié)果result return result })})

從上面可以看出array.js中重寫了數(shù)組的push、pop、shift、unshift、splice、sort、reverse七種方法,重寫方法在實現(xiàn)時除了將數(shù)組方法名對應(yīng)的原始方法調(diào)用一遍并將執(zhí)行結(jié)果返回外,還通過執(zhí)行ob.dep.notify()將當(dāng)前數(shù)組的變更通知給其訂閱者,這樣當(dāng)使用重寫后方法改變數(shù)組后,數(shù)組訂閱者會將這邊變化更新到頁面中。

重寫完數(shù)組的上述7種方法外,我們還需要將這些重寫的方法應(yīng)用到數(shù)組上,因此在Observer構(gòu)造函數(shù)中,可以看到在監(jiān)聽數(shù)據(jù)時會判斷數(shù)據(jù)類型是否為數(shù)組。當(dāng)為數(shù)組時,如果瀏覽器支持__proto__,則直接將當(dāng)前數(shù)據(jù)的原型__proto__指向重寫后的數(shù)組方法對象arrayMethods,如果瀏覽器不支持__proto__,則直接將arrayMethods上重寫的方法直接定義到當(dāng)前數(shù)據(jù)對象上;當(dāng)數(shù)據(jù)類型為非數(shù)組時,繼續(xù)遞歸執(zhí)行數(shù)據(jù)的監(jiān)聽。

// src/core/observer/index.jsexport class Observer { ... constructor (value: any) { this.value = value this.dep = new Dep() this.vmCount = 0 def(value, ’__ob__’, this) if (Array.isArray(value)) { if (hasProto) { protoAugment(value, arrayMethods) } else { copyAugment(value, arrayMethods, arrayKeys) } this.observeArray(value) } else { this.walk(value) } } ...}function protoAugment (target, src: Object) { /* eslint-disable no-proto */ target.__proto__ = src /* eslint-enable no-proto */}function copyAugment (target: Object, src: Object, keys: Array<string>) { for (let i = 0, l = keys.length; i < l; i++) { const key = keys[i] def(target, key, src[key]) }}

經(jīng)過上述處理后,對于數(shù)組,當(dāng)我們調(diào)用其方法處理數(shù)組時會按照如下原型鏈來獲取數(shù)組方法:

vue中是怎樣監(jiān)聽數(shù)組變化的

對于響應(yīng)式數(shù)組,當(dāng)瀏覽器支持__proto__屬性時,使用push等方法時先從其原型arrayMethods上尋找push方法,也就是重寫后的方法,處理之后數(shù)組的變化會通知到其訂閱者,更新頁面,當(dāng)在arrayMethods上查詢不到時會向上在Array.prototype上查詢;當(dāng)瀏覽器不支持__proto__屬性時,使用push等方法時會先從數(shù)組自身上查詢,如果查詢不到會向上再Array.prototype上查詢。

對于非響應(yīng)式數(shù)組,當(dāng)使用push等方法時會直接從Array.prototype上查詢。

值得一提的是源碼中通過判斷瀏覽器是否支持__proto__來分別使用protoAugment和copyAugment 方法將重寫后的數(shù)組方法應(yīng)用到數(shù)組中,這是因為對于IE10及以下的IE瀏覽器是不支持__proto__屬性的:

上述截圖參考于Vue源碼解析五——數(shù)據(jù)響應(yīng)系統(tǒng)

結(jié)論:

在將數(shù)組處理成響應(yīng)式數(shù)據(jù)后,如果使用數(shù)組原始方法改變數(shù)組時,數(shù)組值會發(fā)生變化,但是并不會觸發(fā)數(shù)組的setter來通知所有依賴該數(shù)組的地方進(jìn)行更新,為此,vue通過重寫數(shù)組的某些方法來監(jiān)聽數(shù)組變化,重寫后的方法中會手動觸發(fā)通知該數(shù)組的所有依賴進(jìn)行更新。

如果我的內(nèi)容能對你有所幫助,我就很開心啦!

以上就是vue中是怎樣監(jiān)聽數(shù)組變化的的詳細(xì)內(nèi)容,更多關(guān)于vue 監(jiān)聽數(shù)組變化的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
美女被久久久| 国产91欧美| 亚洲一区二区三区高清不卡| 日韩精品诱惑一区?区三区| 日韩欧美一区二区三区在线观看| 亚洲成人va| 亚洲欧美日韩国产| 天堂精品久久久久| 国产精品一国产精品k频道56| 卡一卡二国产精品| 特黄特色欧美大片| 亚洲人成毛片在线播放女女| 欧美日本三区| 成人va天堂| 亚洲色图国产| 久久99视频| 久久五月天小说| 免费精品视频在线| 国产精品嫩模av在线| 激情国产在线| 99pao成人国产永久免费视频| 少妇精品久久久一区二区| 国产精品嫩模av在线| 欧美午夜精彩| 奇米777国产一区国产二区| 精品一区二区三区的国产在线观看| 久久久精品午夜少妇| 日韩美女精品| 精品一区亚洲| 欧美激情五月| 国产亚洲毛片| 精品国产乱码久久久久久樱花| 伊人久久亚洲影院| 国产精品地址| 中文日韩欧美| www在线观看黄色| 婷婷五月色综合香五月| 日本综合字幕| 欧美日韩在线精品一区二区三区激情综合 | 亚洲麻豆一区| 国产成人精品一区二区三区在线| 视频一区二区三区入口| 大香伊人久久精品一区二区| 视频一区在线播放| 国产福利电影在线播放| 日韩有吗在线观看| 韩日一区二区三区| 精品久久久网| 91嫩草精品| 久久aⅴ国产紧身牛仔裤| 国产精品精品国产一区二区| 欧美久久一区二区三区| 日韩专区一卡二卡| 91精品国产福利在线观看麻豆| 久久一区国产| 日韩一区中文| 在线视频免费在线观看一区二区| 日韩三区免费| 国产成人精品一区二区免费看京 | 美女精品一区| 国产 日韩 欧美一区| 欧美激情99| 日韩av不卡一区二区| 男人的天堂久久精品| 欧美成a人免费观看久久| 久久字幕精品一区| 日韩成人一级| 天堂va蜜桃一区二区三区| 欧美成人高清| 成人羞羞在线观看网站| 精品一区二区三区中文字幕| 国产日韩高清一区二区三区在线| 亚洲精品免费观看| 亚洲精品网址| 欧美日韩国产免费观看视频| 丁香六月综合| 久久精品国产成人一区二区三区| 中文不卡在线| 国产精品呻吟| 亚洲欧美日韩专区| 激情婷婷久久| 伊人精品一区| 中文一区一区三区高中清不卡免费| 国产精品videossex久久发布| 亚洲精品精选| 丝袜诱惑制服诱惑色一区在线观看 | 国产精品日韩精品中文字幕| 日本一区二区中文字幕| 亚洲免费毛片| 日韩有吗在线观看| 四虎精品永久免费| 日韩中文字幕| 亚洲一区二区三区久久久| 三级欧美在线一区| 国产亚洲在线观看| 国产精品毛片在线| 狠狠色狠狠色综合日日tαg| 99久久精品费精品国产| 亚洲1234区| 亚洲综合电影| 欧美成人a交片免费看| 97国产精品| 欧美aa在线观看| 欧美日韩国产在线观看网站| 欧美不卡在线| 爽爽淫人综合网网站 | 99视频精品全国免费| 久久狠狠婷婷| 美女毛片一区二区三区四区| 99re国产精品| 亚洲毛片在线| 久久黄色影视| 久久一区精品| 久久精品亚洲欧美日韩精品中文字幕| 999久久久91| 中文国产一区| 日韩中文av| 久久av免费看| 日韩在线短视频| 9久re热视频在线精品| 另类av一区二区| 亚洲字幕久久| 国产精品观看| 天堂中文av在线资源库| 亚洲精品123区| 91欧美日韩在线| 国产一区二区三区探花| 亚洲二区在线| 清纯唯美亚洲综合一区| 成人一区而且| 免费不卡中文字幕在线| 国产香蕉精品| se01亚洲视频| 亚洲色图国产| 精品国产鲁一鲁****| 亚洲一级二级| 蜜臀久久久久久久| 国产高清视频一区二区| 久久久久久美女精品| 亚洲一区欧美| 国产不卡精品在线| 99香蕉国产精品偷在线观看 | 午夜日韩福利| 国产精品最新自拍| 久久精品国产68国产精品亚洲| 亚洲综合小说| 精品国产亚洲日本| 91久久久精品国产| 国产日韩1区| 日韩电影免费网站| 日精品一区二区三区| 三上悠亚国产精品一区二区三区| 蜜桃av一区二区三区电影| 另类欧美日韩国产在线| 婷婷中文字幕一区| 精品一区二区三区中文字幕视频| 欧美日韩视频| 老色鬼精品视频在线观看播放| 婷婷亚洲五月色综合| 国产精品magnet| 久久亚洲欧洲| 在线手机中文字幕| 国产精选一区| 亚洲视频二区| 国产一区二区三区四区大秀| 久久国产精品99国产| 精品国产亚洲一区二区三区大结局| 免费日韩av片| 亚洲人成在线网站| 国产精品videosex极品| 视频一区二区欧美| 1000部精品久久久久久久久| 国际精品欧美精品| 久久国内精品自在自线400部| 国产视频一区三区| 日韩影院二区| 欧美国产另类| 日韩高清一区二区| 黄色日韩在线| 久久久久久自在自线| 国产精品一区毛片| 日韩欧美久久| 久久国产精品99国产| 亚洲无线一线二线三线区别av| 精品久久99| 国产日本久久| 日韩精品一区二区三区中文字幕| 一区在线免费观看| 色爱综合av| 日本久久黄色| 国产极品一区| 欧美在线看片| 亚洲精品国模| 丝瓜av网站精品一区二区| 日韩在线精品| 高清一区二区三区av| 国产一区二区三区四区五区| 国产精品白丝一区二区三区| 日韩中文一区二区| 色8久久久久|