本文小編為大家詳細(xì)介紹“Vue模擬實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的方法”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Vue模擬實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的方法”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
創(chuàng)新互聯(lián)是一家專業(yè)提供新巴爾虎左企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、HTML5、小程序制作等業(yè)務(wù)。10年已為新巴爾虎左眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
一、前言
之前實(shí)現(xiàn)了為每個(gè)對(duì)象擴(kuò)展一個(gè)$set方法,用于新增屬性使用,這樣就可以監(jiān)聽(tīng)新增的屬性了。
當(dāng)然,數(shù)組也是對(duì)象,也可以通過(guò)$set方法實(shí)現(xiàn)新增屬性。
但是,對(duì)于數(shù)組而言,通常我們是通過(guò)push之類的方法吧。
PS:Vue中明確指出push、pop、shift、unshift、splice、sort、reverse方法為變異方法,可以通過(guò)它們監(jiān)聽(tīng)屬性變化,觸發(fā)視圖更新(詳情見(jiàn)here)
下面,我們就一起來(lái)實(shí)現(xiàn)這些Array的變異方法吧。
注:我們將Array變異方法實(shí)現(xiàn),也寫在extendObj.js中的,因?yàn)閿?shù)組也是對(duì)象嘛。
二、Array變異方法實(shí)現(xiàn)
要實(shí)現(xiàn)這些變異方法,毫無(wú)疑問(wèn),我們會(huì)重寫它們,那在Array.prototype里面重寫嗎?
當(dāng)然不是,這樣不就影響了所有數(shù)組對(duì)象的原型鏈了么!
為了避免這種情況,且,我們只是想在監(jiān)聽(tīng)數(shù)據(jù)對(duì)象上繼承這些變異數(shù)組方法,那么細(xì)心的你會(huì)發(fā)現(xiàn),其實(shí)與我們?cè)?quot;模擬Vue之?dāng)?shù)據(jù)驅(qū)動(dòng)3"中實(shí)現(xiàn)$set方法類似了。
首先,我們創(chuàng)建arrKeys對(duì)象用于保存需要變異的數(shù)組方法以及恒定對(duì)象extendArr,如下:
let arrKeys = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']; const extendArr = [];
接著,就是在extendArr對(duì)象上,一一監(jiān)聽(tīng)arrKeys中的方法了,與$set方法類似,整體結(jié)構(gòu)如下:
!function(){ arrKeys.forEach(function(key){ proxyObject(extendArr, key, function(){ //TODO }); }); }();
注:proxyObject方法其實(shí)核心就是Object.defineProperty,詳見(jiàn)"模擬Vue之?dāng)?shù)據(jù)驅(qū)動(dòng)3".
接下來(lái),就是實(shí)現(xiàn)核心部分代碼了,重寫這些方法的目的,是為了監(jiān)聽(tīng)數(shù)據(jù)變化,所以要在方法原有功能不變的情況下,重寫它們,Array.xxx.apply即可實(shí)現(xiàn)原有功能。
且,push、unshift、splice這三個(gè)方法可以在原數(shù)組中,新增屬性,故而,我們需要監(jiān)聽(tīng)新增屬性以及它們的屬性值,這里就和$set方法完全一樣了,通過(guò)$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)聽(tīng)的對(duì)象上繼承這些變異方法咯,如下:
//observer.js function 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); }
好了,一切完畢,接下來(lái)就測(cè)試下唄:
<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模擬實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的方法”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站名稱:Vue模擬實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的方法
分享網(wǎng)址:http://www.rwnh.cn/article24/jdgpje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、軟件開發(fā)、響應(yīng)式網(wǎng)站、網(wǎng)站排名、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)