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

資訊專欄INFORMATION COLUMN

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

niuxiaowei111 / 2657人閱讀

摘要:通過(guò)裝作這些變化,我們實(shí)現(xiàn)了從而到達(dá)了數(shù)據(jù)變化觸發(fā)函數(shù)的過(guò)程。于此同時(shí),我們還實(shí)現(xiàn)了來(lái)擴(kuò)展這個(gè)可響應(yīng)的結(jié)構(gòu),讓這個(gè)對(duì)象擁有了觸發(fā)和響應(yīng)事件的能力。最后,根據(jù)我們的實(shí)現(xiàn),這是最終的產(chǎn)出,一個(gè)框架,了解一下系列文章地址優(yōu)化優(yōu)化總結(jié)

看這篇之前,如果沒(méi)有看過(guò)之前的文章,移步拉到文章末尾查看之前的文章。

provide / inject

在上一步我們實(shí)現(xiàn)了,父子組件,和 props 一樣 provide / inject 也是基于父子組件實(shí)現(xiàn)的,相比于 props 它的實(shí)現(xiàn)還要更簡(jiǎn)單一點(diǎn)。我們先來(lái)看看官網(wǎng)上對(duì) provide / inject 的描述。

這對(duì)選項(xiàng)需要一起使用,以允許一個(gè)祖先組件向其所有子孫后代注入一個(gè)依賴,不論組件層次有多深,并在起上下游關(guān)系成立的時(shí)間里始終生效。

首先,由官網(wǎng)的例子可知,provide 的值是靜態(tài)的,并不會(huì)去綁定到 data 中的內(nèi)容。

so 靜態(tài)的,簡(jiǎn)單~,那實(shí)現(xiàn)一下。

export class Vue extends Event {
    ···
    _init(options) {
        ···
        // 用實(shí)例下的 _provide 屬性,保存?zhèn)魅氲?provide
        vm._provide = vm.$options.provide

        // 從父組件的 _provide 取對(duì)應(yīng)屬性,若沒(méi)有繼續(xù)往上找,直到找到根節(jié)點(diǎn)
        // 若找到根節(jié)點(diǎn)還沒(méi)有,就使用默認(rèn)值
        let inject = vm._inject = {}
        for (let key in  vm.$options.inject) {
            inject[key] = getProvideForInject(vm, key, vm.$options.inject[key].default)
        }
        // 代理到 this 下
        for (let key in inject) {
            proxy(vm, "_inject", key)
        }
    }
}

測(cè)試代碼:

import {Vue} from "./Vue.mjs"

let test = new Vue({
    provide: {
        foo: "bar"
    },
    components: {
        sub: {
            inject: {
                foo: {default: "foo"},
                bar: {default: "subBar"}
            },
            components: {
                subSub: {
                    inject: {
                        foo: {default: "foo"},
                        bar: {default: "subSubBar"}
                    }
                }
            }
        }
    }
})

let testSubClass = Vue.extend(test.$options.components.sub)
let testSub = new testSubClass({parent: test})

let testSubSubClass = Vue.extend(testSub.$options.components.subSub)
let testSubSub = new testSubSubClass({parent: testSub})

console.log(testSub.foo)
// bar
console.log(testSub.bar)
// subBar
console.log(testSubSub.foo)
// bar
console.log(testSubSub.bar)
// subSubBar

查看完整的代碼

ok 其實(shí)這對(duì)屬性的實(shí)現(xiàn)挺簡(jiǎn)單的,就是取值而已。

到此為止,Vue 中關(guān)于數(shù)據(jù)綁定的部分基本上實(shí)現(xiàn)的差不多了(不包括 directives/filters/slot/ref ···這些與頁(yè)面渲染的東西)

但也有以下東西沒(méi)實(shí)現(xiàn)內(nèi)容簡(jiǎn)單就不過(guò)多的介紹了

mixins: 就是 options 的合并

生命周期函數(shù): 在特定的時(shí)間觸發(fā)特定名稱的事件即可

$nextTick: 可以去看看 JS Event Loop 的相關(guān)內(nèi)容,優(yōu)先使用微任務(wù)來(lái)實(shí)現(xiàn)

接下來(lái)我們來(lái)想想,目前我們實(shí)現(xiàn)的東西都能干嘛?

總結(jié)

總的來(lái)說(shuō),我們實(shí)現(xiàn)了一個(gè)可響應(yīng)的對(duì)象,我們可以拿到這個(gè)對(duì)象下數(shù)據(jù)的變化。

通過(guò)裝作這些變化,我們實(shí)現(xiàn)了 ComputedWatcher 從而到達(dá)了數(shù)據(jù)變化觸發(fā)函數(shù)的過(guò)程。

于此同時(shí),我們還實(shí)現(xiàn)了 Event 來(lái)擴(kuò)展這個(gè)可響應(yīng)的結(jié)構(gòu),讓這個(gè)對(duì)象擁有了觸發(fā)和響應(yīng)事件的能力。

最后我們實(shí)現(xiàn)了實(shí)例的樹(shù)結(jié)構(gòu),在這個(gè)基礎(chǔ)上實(shí)現(xiàn)了 propsprovide/inject

那么還是那個(gè)問(wèn)題,這個(gè)東西能干嘛用?

我想了想,前端的應(yīng)用很明顯,我們只要加一個(gè)視圖層的渲染函數(shù),就能補(bǔ)充成一個(gè) MVVM 框架,Vue 也是在這個(gè)基礎(chǔ)上實(shí)現(xiàn)的。當(dāng)然你也可以實(shí)現(xiàn)自己虛擬節(jié)點(diǎn),創(chuàng)造一個(gè)屬于你自己的 MVVM 框架。

或者小型的項(xiàng)目,并不需要虛擬節(jié)點(diǎn),那么綁定一個(gè) HTML 渲染函數(shù)即可,所以我們實(shí)現(xiàn)的這個(gè)可響應(yīng)結(jié)構(gòu)對(duì)于 MVVM 來(lái)說(shuō),僅僅少了一層 VIEW ,所以我想叫 MVM 也是沒(méi)問(wèn)題的。

但是我想這個(gè)東西是純 Js 的,所以能發(fā)揮的能力也肯定不僅僅是在前端,我之所以將這個(gè)完全的脫離模板來(lái)分析,也是想把這塊多帶帶出來(lái)成為一個(gè)工具。

對(duì)于這個(gè)可響應(yīng)結(jié)構(gòu),我想了想用處:

項(xiàng)目自動(dòng)化配置,打包,初始化

根據(jù)配置篩選數(shù)據(jù)

···

對(duì)于第一點(diǎn),假設(shè)我們有一個(gè)項(xiàng)目的配置(一個(gè) js 對(duì)象),然后我們把這個(gè)對(duì)象變成響應(yīng)結(jié)構(gòu),那么當(dāng)這個(gè)對(duì)象發(fā)生變化的時(shí)候,比如說(shuō)版本號(hào)變動(dòng),那么可以觸發(fā)更新代碼,打包編譯代碼,發(fā)送代碼到服務(wù)等一些列的步驟。

對(duì)于第二點(diǎn),假設(shè)在后端,我們有一堆數(shù)據(jù),我們的需求是根據(jù)需求去篩選數(shù)據(jù),比如 pageNo/pageSize 等等,那么我們可以根據(jù)需求定下一個(gè) js 配置對(duì)象,然后針對(duì)每個(gè)屬性添加一系列定義好的 Watcher ,那么我們就可以根據(jù)這個(gè)對(duì)象的變動(dòng)執(zhí)行特定的方法,而我們所需要做的僅僅是把配置對(duì)象的屬性改一下就好,比如說(shuō)當(dāng)執(zhí)行 obj.pageNo = 2 ,然后程序就自動(dòng)的把對(duì)應(yīng)的數(shù)據(jù)給篩選出來(lái)了。

當(dāng)然,這個(gè)可響應(yīng)的結(jié)構(gòu)的用處遠(yuǎn)不至于此,只要以數(shù)據(jù)驅(qū)動(dòng)或是配置化的地方,都有用武之地。

ok finally 這個(gè)系列的文章算是結(jié)束了,至于 VUE 中關(guān)于,模板解析和虛擬 DOM 的實(shí)現(xiàn),會(huì)有多帶帶的系列,但模板解析大部分是在正則解析,所以可能會(huì)沒(méi)有。

最后,根據(jù)我們的實(shí)現(xiàn),這是最終的產(chǎn)出,一個(gè) MVM 框架,了解一下?

系列文章地址

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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

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

相關(guān)文章

  • VUE - MVVM - part12 - props

    摘要:看這篇之前,如果沒(méi)有看過(guò)之前的文章,移步拉到文章末尾查看之前的文章。而該組件實(shí)例的父實(shí)例卻并不固定,所以我們將這些在使用時(shí)才能確定的參數(shù)在組件實(shí)例化的時(shí)候傳入。系列文章地址優(yōu)化優(yōu)化總結(jié) 看這篇之前,如果沒(méi)有看過(guò)之前的文章,移步拉到文章末尾查看之前的文章。 前言 在上一步,我們實(shí)現(xiàn) extend 方法,用于擴(kuò)展 Vue 類,而我們知道子組件需要通過(guò) extend 方法來(lái)實(shí)現(xiàn),我們從測(cè)試?yán)?..

    bluesky 評(píng)論0 收藏0
  • VUE - MVVM - part10 - Computed

    摘要:了解之后我們來(lái)實(shí)現(xiàn)它,同樣的為了方便理解我寫(xiě)成了一個(gè)類這里的一般是的實(shí)例將屬性代理到實(shí)例下的構(gòu)造函數(shù)我們實(shí)現(xiàn)了代理屬性和更新計(jì)算屬性的值,同時(shí)依賴沒(méi)變化時(shí),也是不會(huì)觸發(fā)的更新,解決了以上的個(gè)問(wèn)題。 看這篇之前,如果沒(méi)有看過(guò)之前的文章,移步拉到文章末尾查看之前的文章。 回顧 先捋一下,之前我們實(shí)現(xiàn)的 Vue 類,主要有一下的功能: 屬性和方法的代理 proxy 監(jiān)聽(tīng)屬性 watche...

    callmewhy 評(píng)論0 收藏0
  • VUE - MVVM - part1 - defineProperty

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

    liukai90 評(píng)論0 收藏0
  • VUE - MVVM - part7 - Event

    摘要:事件是什么在標(biāo)準(zhǔn)瀏覽器中,我們經(jīng)常使用來(lái)為一個(gè)添加一個(gè)事件等。仔細(xì)看這些情況,歸結(jié)到代碼中,無(wú)非就是一個(gè)行為或情況的名稱,和一些列的動(dòng)作,而在中動(dòng)作就是,一系列的動(dòng)作就是一個(gè)函數(shù)的集合。 看這篇之前,如果沒(méi)有看過(guò)之前的文章,可拉到文章末尾查看之前的文章。 事件是什么? 在標(biāo)準(zhǔn)瀏覽器中,我們經(jīng)常使用:addEventListener 來(lái)為一個(gè) DOM 添加一個(gè)事件(click、mouse...

    xialong 評(píng)論0 收藏0
  • VUE - MVVM - part2 - Dep

    摘要:看這篇之前,如果沒(méi)看過(guò)先移步看實(shí)現(xiàn)中。同樣的,在取值時(shí)收集依賴,在設(shè)置值當(dāng)值發(fā)生變化時(shí)觸發(fā)依賴。中實(shí)現(xiàn)了一個(gè)的類來(lái)處理以上兩個(gè)問(wèn)題,之后再說(shuō)。以下語(yǔ)法下的,源碼中差不多就這樣點(diǎn)擊查看相關(guān)代碼系列文章地址優(yōu)化優(yōu)化總結(jié) 看這篇之前,如果沒(méi)看過(guò) step1 先移步看 實(shí)現(xiàn) VUE 中 MVVM - step1 - defineProperty。 在上一篇我們大概實(shí)現(xiàn)了,Vue 中的依賴收集和...

    hover_lew 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<