溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Vue Array變異方法怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2022-01-27 09:42:02 來源:億速云 閱讀:118 作者:iii 欄目:web開發(fā)

本篇內(nèi)容介紹了“Vue Array變異方法怎么實(shí)現(xiàn)”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

一、前言

在"模擬Vue之?dāng)?shù)據(jù)驅(qū)動(dòng)3"中,我們實(shí)現(xiàn)了為每個(gè)對象擴(kuò)展一個(gè)$set方法,用于新增屬性使用,這樣就可以監(jiān)聽新增的屬性了。

當(dāng)然,數(shù)組也是對象,也可以通過$set方法實(shí)現(xiàn)新增屬性。

但是,對于數(shù)組而言,通常我們是通過push之類的方法吧。

PS:Vue中明確指出push、pop、shift、unshift、splice、sort、reverse方法為變異方法,可以通過它們監(jiān)聽屬性變化,觸發(fā)視圖更新

注:我們將Array變異方法實(shí)現(xiàn),也寫在extendObj.js中的,因?yàn)閿?shù)組也是對象嘛。

二、Array變異方法實(shí)現(xiàn)

要實(shí)現(xiàn)這些變異方法,毫無疑問,我們會(huì)重寫它們,那在Array.prototype里面重寫嗎?

當(dāng)然不是,這樣不就影響了所有數(shù)組對象的原型鏈了么!

為了避免這種情況,且,我們只是想在監(jiān)聽數(shù)據(jù)對象上繼承這些變異數(shù)組方法,那么細(xì)心的你會(huì)發(fā)現(xiàn),其實(shí)與我們在"模擬Vue之?dāng)?shù)據(jù)驅(qū)動(dòng)3"中實(shí)現(xiàn)$set方法類似了。

首先,我們創(chuàng)建arrKeys對象用于保存需要變異的數(shù)組方法以及恒定對象extendArr,如下:

let arrKeys = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];const extendArr = [];

接著,就是在extendArr對象上,一一監(jiān)聽arrKeys中的方法了,與$set方法類似,整體結(jié)構(gòu)如下:

!function(){ arrKeys.forEach(function(key){ proxyObject(extendArr, key, function(){ //TODO }); });}();

注:proxyObject方法其實(shí)核心就是Object.defineProperty,詳見"模擬Vue之?dāng)?shù)據(jù)驅(qū)動(dòng)3".

接下來,就是實(shí)現(xiàn)核心部分代碼了,重寫這些方法的目的,是為了監(jiān)聽數(shù)據(jù)變化,所以要在方法原有功能不變的情況下,重寫它們,Array.xxx.apply即可實(shí)現(xiàn)原有功能。

且,push、unshift、splice這三個(gè)方法可以在原數(shù)組中,新增屬性,故而,我們需要監(jiān)聽新增屬性以及它們的屬性值,這里就和$set方法完全一樣了,通過$Observer,即可利用observe以及convert方法實(shí)現(xiàn)了。

實(shí)現(xiàn)代碼如下:

!function(){ arrKeys.forEach(function(key){ proxyObject(extendArr, key, function(){ console.log('Fun ' + key + ' is observed'); let result; let arrProto = Array.prototype; let ob = this.$Observer; let arr = arrProto.slice.call(arguments); let inserted; let index; switch(key){ case 'push': { inserted = arr; index = this.length; break; } case 'unshift': { inserted = arr; index = 0; break; } case 'splice': { inserted = arr.slice(2); index = arr[0]; break; } } result = arrProto[key].apply(this, arguments); if(inserted){ inserted.forEach(val => { ob.observe(val); ob.convert(index++, val); }); } return result; }); });}();

最后,就是在需要監(jiān)聽的對象上繼承這些變異方法咯,如下:

//observer.jsfunction Observer(data){ if(!(this instanceof Observer)){ return new Observer(data); } data.__proto__ = extendObj; //繼承變異方法push、pop等等 if(Array.isArray(data)){ data.__proto__.__proto__ = extendArr; } this.data = data; this.walk(data); }

好了,一切完畢,接下來就測試下唄:

<script src="./extendObj.js"></script><script src="./observer.js"></script><script> 'use strict'; let data = { msg: [5, 2, 0], user: { name: 'Monkey', age: 24 }, lover: { name: 'Dorie', age: 23 } }; Observer(data);</script>

“Vue Array變異方法怎么實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI