Array的變化偵測(cè)(二)

偵測(cè)數(shù)組中元素變化

偵測(cè)數(shù)組的變化類(lèi)比對(duì)Object的遞歸處理,我們也需要監(jiān)測(cè)子項(xiàng)的變化。
另外,數(shù)組與對(duì)象的使用需求有些不同,數(shù)組要求新增的項(xiàng)依然能夠被監(jiān)測(cè)到(想象你對(duì)一個(gè)響應(yīng)式的數(shù)組push一個(gè)子數(shù)組,后面操作這個(gè)子數(shù)組時(shí),頁(yè)面沒(méi)反應(yīng),就顯得奇怪了?。?/em>。
首先做對(duì)子項(xiàng)的偵測(cè):

export class Observer{
    constructor(value){
        this.value = value;
        def(value, '__ob__', this);
        if(Array.isArray(value)){
            this.observeArray(value);
        } else {
            this.walk(value);
        }
    }
    observeArray(items){
        for(let i = 0, l = keys.length;i < l;i++){
            observe(items[i]);
        }
    }
}

像這樣對(duì)數(shù)組進(jìn)行遞歸的處理就可以做到子項(xiàng)變成響應(yīng)式的了。

偵測(cè)新增元素的變化
[
    'push',
    'pop',
    'shift',
    'unshift',
    'splice',
    'sorte',
    'reverse'
].forEach(function(method){
    const original = arrayProto[method];
    def(arrayMethods, method, function mutator(...args){
            const ob = this.__ob__;
            let inserted;
            switch(method){
                case 'push':
                case 'unshift':
                    inserted = args;
                    break;
                case 'splice':
                    inserted = args.slice(2);
                    break;
            }
            ob.dep.notify();
            return original.apply(this, args);
        })
})

不難發(fā)現(xiàn)九個(gè)方法中,可以新增元素的只有前插、后插和插入操作,捕捉響應(yīng)的參數(shù)就好了。
獲取的到新增元素的話就可以遞歸的把這些變成響應(yīng)式數(shù)據(jù)了。

[
    'push',
    'pop',
    'shift',
    'unshift',
    'splice',
    'sorte',
    'reverse'
].forEach(function(method){
    const original = arrayProto[method];
    def(arrayMethods, method, function mutator(...args){
            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); // 新增
            ob.dep.notify();
            return original.apply(this, args);
        })
})
偵測(cè)數(shù)組的缺陷

由于是通過(guò)攔截原型方法完成響應(yīng),因此,對(duì)于通過(guò)[]直接修改和對(duì)length的賦值無(wú)法偵測(cè)。

this.list[0] = 2;
this.list.length = 0;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第5章 引用類(lèi)型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類(lèi)型 使用基本類(lèi)型...
    大學(xué)一百閱讀 3,679評(píng)論 0 4
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,851評(píng)論 0 3
  • 深入淺出 - vue變化偵測(cè)原理 關(guān)于vue的內(nèi)部原理其實(shí)有很多個(gè)重要的部分,變化偵測(cè),模板編譯,virtualD...
    如煙灬閱讀 308評(píng)論 0 1
  • HTML 5 HTML5概述 因特網(wǎng)上的信息是以網(wǎng)頁(yè)的形式展示給用戶(hù)的,因此網(wǎng)頁(yè)是網(wǎng)絡(luò)信息傳遞的載體。網(wǎng)頁(yè)文件是用...
    阿啊阿吖丁閱讀 4,953評(píng)論 0 0
  • 仰望清空,朵朵黑云鑲嵌著銀色的光暈。 回想著一幕幕的過(guò)往云煙,心死! 我錯(cuò)了嗎?一遍遍的問(wèn)...
    蟲(chóng)_53b8閱讀 285評(píng)論 2 0

友情鏈接更多精彩內(nèi)容