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

vue中實(shí)現(xiàn)監(jiān)聽數(shù)組內(nèi)部元素

 更新時(shí)間:2022年08月24日 08:51:18   作者:小道士在路上  
這篇文章主要介紹了vue中實(shí)現(xiàn)監(jiān)聽數(shù)組內(nèi)部元素方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue監(jiān)聽數(shù)組內(nèi)部元素

在VUE中,對(duì)數(shù)組的監(jiān)聽是淺監(jiān)聽,也就是它只能監(jiān)聽到數(shù)組的長(zhǎng)度或者有無的變化,當(dāng)我們修改數(shù)組中的某一個(gè)值時(shí),也就是數(shù)組的長(zhǎng)度狀態(tài)并沒有改變時(shí),在正常情況下它是無法監(jiān)聽到的,在watch中我們知道可以使用deep屬性進(jìn)行深監(jiān)聽,那么在其他情況下呢?

我們有兩種辦法解決此問題

1.通過原生的js對(duì)數(shù)組先進(jìn)行切割,然后在添加新的內(nèi)容(也就是我們要修改的內(nèi)容)

array.splice(i, 1, newdata); ? ?//從i位置開始 ?刪除1個(gè)元素并用newdata來替代它

2.使用vue提供的函數(shù)$set

$set(array,i,newdata); ? //把a(bǔ)rray數(shù)組的第i的值替換為newdata

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

修改了數(shù)組對(duì)象的原型,在原本的原型鏈上插入了一個(gè)新的原型對(duì)象,在新的原型對(duì)象上重寫了7個(gè)變異方法(push/pop/unshift/shift/splice/sort/reverse)

var arrayProto = Array.prototype
var newArrayProto = Object.create(arrayProto)
newArrayProto.push = function (...rest) {
    // 監(jiān)聽到調(diào)用了數(shù)組的push方法,執(zhí)行視圖渲染的代碼
    console.log('監(jiān)聽到調(diào)用了數(shù)組的push方法,執(zhí)行視圖渲染的代碼,添加之前的邏輯。。。。')

    // 為了保留原來的數(shù)組push方法的邏輯
    arrayProto.push.call(this, ...rest)

    console.log('數(shù)組push方法添加之后的邏輯,。。。。。')
}
// 在遞歸遍歷數(shù)據(jù)的時(shí)候,只要找到數(shù)組數(shù)據(jù),就將其原型指向?yàn)閚ewArrayProto
// arr.__proto__ = newArrayProto
var arr = [1,2,3]
arr.__proto__ = newArrayProto

在這里插入圖片描述

為什么沒有像對(duì)象一樣用Object.defineProperty監(jiān)聽數(shù)組中所有的元素變化呢?

因?yàn)閿?shù)組中的元素有可能有很多個(gè),如果循環(huán)遍歷,開銷太大!不能這樣。。。Vue給我們提供了支持驅(qū)動(dòng)視圖的API(this.$set,Vue.set),還有重寫了7個(gè)變異方法

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

定南县| 宿州市| 宜丰县| 荔波县| 靖边县| 星座| 田阳县| 吉木萨尔县| 阳春市| 西安市| 修武县| 二连浩特市| 依安县| 河源市| 连山| 石屏县| 抚顺市| 莱阳市| 蓝山县| 江山市| 枝江市| 渭源县| 财经| 南康市| 将乐县| 清远市| 天全县| 金沙县| 新邵县| 六安市| 和林格尔县| 原阳县| 武威市| 紫阳县| 桂林市| 屯昌县| 石景山区| 安新县| 昭通市| 乐业县| 灌南县|