vue中實(shí)現(xiàn)監(jiān)聽(tīng)數(shù)組內(nèi)部元素
vue監(jiān)聽(tīng)數(shù)組內(nèi)部元素
在VUE中,對(duì)數(shù)組的監(jiān)聽(tīng)是淺監(jiān)聽(tīng),也就是它只能監(jiān)聽(tīng)到數(shù)組的長(zhǎng)度或者有無(wú)的變化,當(dāng)我們修改數(shù)組中的某一個(gè)值時(shí),也就是數(shù)組的長(zhǎng)度狀態(tài)并沒(méi)有改變時(shí),在正常情況下它是無(wú)法監(jiān)聽(tīng)到的,在watch中我們知道可以使用deep屬性進(jìn)行深監(jiān)聽(tīng),那么在其他情況下呢?
我們有兩種辦法解決此問(wèn)題
1.通過(guò)原生的js對(duì)數(shù)組先進(jìn)行切割,然后在添加新的內(nèi)容(也就是我們要修改的內(nèi)容)
array.splice(i, 1, newdata); ? ?//從i位置開(kāi)始 ?刪除1個(gè)元素并用newdata來(lái)替代它
2.使用vue提供的函數(shù)$set
$set(array,i,newdata); ? //把a(bǔ)rray數(shù)組的第i的值替換為newdata
vue如何監(jiān)聽(tīng)數(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)聽(tīng)到調(diào)用了數(shù)組的push方法,執(zhí)行視圖渲染的代碼
console.log('監(jiān)聽(tīng)到調(diào)用了數(shù)組的push方法,執(zhí)行視圖渲染的代碼,添加之前的邏輯。。。。')
// 為了保留原來(lái)的數(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

為什么沒(méi)有像對(duì)象一樣用Object.defineProperty監(jiān)聽(tīng)數(shù)組中所有的元素變化呢?
因?yàn)閿?shù)組中的元素有可能有很多個(gè),如果循環(huán)遍歷,開(kāi)銷太大!不能這樣。。。Vue給我們提供了支持驅(qū)動(dòng)視圖的API(this.$set,Vue.set),還有重寫了7個(gè)變異方法
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決vuejs項(xiàng)目里css引用背景圖片不能顯示的問(wèn)題
今天小編就為大家分享一篇解決vuejs項(xiàng)目里css引用背景圖片不能顯示的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue2使用?element表格展開(kāi)功能渲染子表格的方式
這篇文章主要介紹了vue2使用?element表格展開(kāi)功能渲染子表格的方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
詳解iview的checkbox多選框全選時(shí)校驗(yàn)問(wèn)題
這篇文章主要介紹了詳解iview的checkbox多選框全選時(shí)校驗(yàn)問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
使用Vue.js開(kāi)發(fā)微信小程序開(kāi)源框架mpvue解析
這篇文章主要介紹了使用Vue.js開(kāi)發(fā)微信小程序開(kāi)源框架mpvue解析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
vue中數(shù)組常用的6種循環(huán)方法代碼示例
在vue項(xiàng)目開(kāi)發(fā)中,我們需要對(duì)數(shù)組進(jìn)行處理等問(wèn)題,這里簡(jiǎn)單記錄遍歷數(shù)組的幾種方法,這篇文章主要給大家介紹了關(guān)于vue中數(shù)組常用的6種循環(huán)方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
vue中@click和@click.native.prevent的區(qū)別
這篇文章主要介紹了vue中@click和@click.native.prevent的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04

