成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

VUE - MVVM - part2 - Dep

hover_lew / 522人閱讀

摘要:看這篇之前,如果沒看過先移步看實現(xiàn)中。同樣的,在取值時收集依賴,在設置值當值發(fā)生變化時觸發(fā)依賴。中實現(xiàn)了一個的類來處理以上兩個問題,之后再說。以下語法下的,源碼中差不多就這樣點擊查看相關代碼系列文章地址優(yōu)化優(yōu)化總結(jié)

看這篇之前,如果沒看過 step1 先移步看 實現(xiàn) VUE 中 MVVM - step1 - defineProperty。

在上一篇我們大概實現(xiàn)了,Vue 中的依賴收集和觸發(fā),但我們僅僅是將依賴維護在一個內(nèi)置數(shù)組中,這樣做雖然容易理解,但畢竟不好維護,為了更容易的維護這些依賴,我們來實現(xiàn)一個維護依賴的類。

確定功能

首先我們可以先確定這個類下的屬性,以及一些功能:

類下屬性:

target 函數(shù),用于存放需要添加的依賴

實例下屬性及方法:

subs/Array 用于存放依賴

addSub/Function 用于添加依賴

removeSub/Function 用于移除依賴

notify/Function 用于執(zhí)行依賴

實現(xiàn)

考慮到直接放在瀏覽器上執(zhí)行,所以直接用 ES5 的類寫法。

let Dep = function(){

    // 實例屬性
    this.subs = []
    
    // 實例方法
    this.addSub = function(sub){
        this.subs.push(sub)
    }
    
    this.removeSub = function(sub){
        const index = this.subs.indexOf(item)
        if (index > -1) {
            this.subs.splice(index, 1)
        }
    }
    
    this.notify = function(newValue, oldVaule){
        this.subs.forEach(fnc=>fnc(newValue, oldVaule))
    }
}

// 類屬性
Dep.target = null

好了,現(xiàn)在我們擁有了一個管理依賴的類(這里將依賴簡化為一個方法),現(xiàn)在我們就可以動手來改一下之前的代碼了。

let defineReactive = function(object, key, value){
    let dep = new Dep()
    Object.defineProperty(object, key, {
        configurable: true,
        enumerable: true,
        get: function(){
            if(Dep.target){
                dep.addSub(Dep.target)
            }
            return value
        },
        set: function(newValue){
            if(newValue != value){
                dep.notify(newValue, value)
            }
            value = newValue
        }
    })
}

可以發(fā)現(xiàn),之前我們用來存放依賴的數(shù)組變成了一個依賴管理(Dep)的實例。同樣的,在取值時收集依賴,在設置值(當值發(fā)生變化)時觸發(fā)依賴。

由于依賴的處理由 Dep 的實例管理了,這里僅僅調(diào)用一下相關方法即可。

接下來試一試效果:

let object = {}
defineReactive(object, "test", "test")
Dep.target = function(newValue, oldValue){
    console.log("我被添加進去了,新的值是:" + newValue)
}
object.test
// test

Dep.target = null
object.test = "test2"
// 我被添加進去了,新的值是:test2

Dep.target = function(newValue, oldValue){
    console.log("添加第二個函數(shù),新的值是:" + newValue)
}
object.test
// test

Dep.target = null
object.test = "test3"
// 我被添加進去了,新的值是:test3
// 添加第二個函數(shù),新的值是:test3

但是上面的代碼暴露了幾個問題

Dep 這個類將監(jiān)聽屬性和處理依賴進行了解耦,但是卻沒有完全解耦,在觸發(fā)依賴的時候,還是得傳新舊值。

上面代碼中 Dep 中定義的 removeSub 在代碼中并沒有用到,因為 Dep 的實例是在 defineReactive 函數(shù)的作用域中,外部并不能直接調(diào)用,而刪除依賴肯定是在外部的環(huán)境中,也就是說即使我們將代碼改成這樣,我們還是不能直接取刪除已經(jīng)沒用的依賴。

Vue 中實現(xiàn)了一個 Watcher 的類來處理以上兩個問題,之后再說。

以下 ES6 語法下的 Dep ,Vue 源碼中差不多就這樣

class Dep {

    constructor() {
        this.subs = []
    }

    addSub(sub) {
        this.subs.push(sub)
    }

    removeSub(sub) {
        const index = this.subs.indexOf(item)
        if (index > -1) {
            this.subs.splice(index, 1)
        }
    }

    notify() {
        this.subs.forEach(fnc=>fnc(oldValue, newValue))
    }
}

Dep.target = null

點擊查看相關代碼

系列文章地址

VUE - MVVM - part1 - defineProperty

VUE - MVVM - part2 - Dep

VUE - MVVM - part3 - Watcher

VUE - MVVM - part4 - 優(yōu)化Watcher

VUE - MVVM - part5 - Observe

VUE - MVVM - part6 - Array

VUE - MVVM - part7 - Event

VUE - MVVM - part8 - 優(yōu)化Event

VUE - MVVM - part9 - Vue

VUE - MVVM - part10 - Computed

VUE - MVVM - part11 - Extend

VUE - MVVM - part12 - props

VUE - MVVM - part13 - inject & 總結(jié)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94133.html

相關文章

  • VUE - MVVM - part3 - Watcher

    摘要:解決第一個問題很簡單,我們把某個屬性的值對應值變化時需要執(zhí)行的函數(shù)抽象成一個對象,然后把這個對象當成是依賴,推入依賴管理中。的實現(xiàn)有了以上的考慮,那個依賴對象在中就是。新值作為添加的第一個函數(shù),很自豪。 看這篇之前,如果沒有看過之前的文章,可拉到文章末尾查看之前的文章。 前言 在 step2 中,我們實現(xiàn)了一個管理依賴的 Dep ,但是僅僅使用這個類并不能完成我們想實現(xiàn)的功能,而且代碼...

    wums 評論0 收藏0
  • VUE - MVVM - part4 - 優(yōu)化Watcher

    摘要:關于中的的實現(xiàn),差不多也就這樣了,當然這僅僅是基礎的實現(xiàn),而且視圖層層渲染抽象成一個函數(shù)。不同于中的實現(xiàn),這里少了很多各種標記和應用標記的過程。 看這篇之前,如果沒有看過之前的文章,可拉到文章末尾查看之前的文章。 回顧 首先我們思考一下截止當前,我們都做了什么 通過 defineReactive 這個函數(shù),實現(xiàn)了對于數(shù)據(jù)取值和設置的監(jiān)聽 通過 Dep 類,實現(xiàn)了依賴的管理 通過 Wa...

    CoffeX 評論0 收藏0
  • VUE - MVVM - part6 - Array

    摘要:回顧在前面的幾個中,我們實現(xiàn)對象的屬性的監(jiān)聽,但是有關于數(shù)組的行為我們一直沒有處理。并且上述的幾個數(shù)組方法是數(shù)組對象提供的,我們要想辦法去觸發(fā)下的函數(shù)。在設置值的時候就能成功觸發(fā)依賴。 看這篇之前,如果沒有看過之前的文章,可拉到文章末尾查看之前的文章。 回顧 在前面的幾個 step 中,我們實現(xiàn)對象的屬性的監(jiān)聽,但是有關于數(shù)組的行為我們一直沒有處理。我們先分析下導致數(shù)組有哪些行為: ...

    0x584a 評論0 收藏0
  • VUE - MVVM - part5 - Observe

    摘要:具體代碼執(zhí)行方式進入到的目錄下,命令行運行即可。確保為一個對象如果對象下有則不需要再次生成函數(shù)返回該對象的實例,這里判斷了如果該對象下已經(jīng)有實例,則直接返回,不再去生產(chǎn)實例。這就確保了一個對象下的實例僅被實例化一次。 看這篇之前,如果沒有看過之前的文章,可拉到文章末尾查看之前的文章。 回顧 在 step4 中,我們大致實現(xiàn)了一個 MVVM 的框架,由3個部分組成: defineRe...

    xi4oh4o 評論0 收藏0
  • VUE - MVVM - part1 - defineProperty

    摘要:在中關于如何實現(xiàn)在網(wǎng)上可以搜出不少,在看了部分源碼后,梳理一下內(nèi)容。換個說法,當我們?nèi)≈档臅r候,函數(shù)自動幫我們添加了針對當前值的依賴,當這個值發(fā)生變化的時候,處理了這些依賴,比如說節(jié)點的變化。 在 VUE 中關于如何實現(xiàn)在網(wǎng)上可以搜出不少,在看了部分源碼后,梳理一下內(nèi)容。 首先,我們需要了解一下 js 中的一個 API :Object.defineProperty(obj, prop,...

    liukai90 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<