今天就跟大家聊聊有關(guān)使用vue如何監(jiān)聽數(shù)組變化,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

我們知道通過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.prototype
export 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
})
})
網(wǎng)站題目:使用vue如何監(jiān)聽數(shù)組變化-創(chuàng)新互聯(lián)
瀏覽地址:http://www.chinadenli.net/article38/iidpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站設(shè)計、關(guān)鍵詞優(yōu)化、微信小程序、外貿(mào)網(wǎng)站建設(shè)、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容