Vuex之module的register實(shí)現(xiàn)

Vuex源碼中module的register方法

register 翻譯為登記 ,可以理解為 每一個(gè)module都進(jìn)行登記
Vuex中的源碼module-collection中兩個(gè)方法

class ModuleCollection {
    // rawRootModule 為 Vue的 options屬性
    constructor (rawRootModule) {
        // register root module (Vuex.Store options)
        this.register([], rawRootModule, false)
    }
    get (path) {
        return path.reduce((module, key) => {
          return module.getChild(key)
        }, this.root)
    }
    // path 為空數(shù)組 []   rawModule 為傳入的options
    register (path, rawModule, runtime = true) {
        /*
            Module創(chuàng)建對象主要參數(shù)為  子元素 module模塊中內(nèi)容 狀態(tài)
            this._children = Object.create(null) 
            this._rawModule = rawModule 
            const rawState = rawModule.state
        */
        const newModule = new Module(rawModule, runtime)
        if (path.length === 0) {
            this.root = newModule
        } else {
          const parent = this.get(path.slice(0, -1))
          parent.addChild(path[path.length - 1], newModule)
        }

        // register nested modules
        if (rawModule.modules) {
          forEachValue(rawModule.modules, (rawChildModule, key) => {
            this.register(path.concat(key), rawChildModule, runtime)
          })
        }
    }
}

模擬實(shí)現(xiàn)

let obj = {
    module:{
        a:{
            state:{
                a:"a"
            },
            module:{
                c:{
                    state:"c",
                }
            }
        },
        b:{
            state:{
                b:"b"
            }
        }
    },
    state:{
        root:"123"
    }
}
/*
    改為 格式
    let root = {
        // 也就是 options
        _raw:rootModule, 
        // 狀態(tài)
        state:{},
        // 子module
        _children:{}
    }
*/
class ModuleCollect{
    constructor(options) {
        // 開始創(chuàng)建為指定格式
        // 參數(shù)1 為屬性名數(shù)組對象
        this.register([],options);
    }
    // 接收 屬性名數(shù)組退唠,和對應(yīng)的option 參數(shù)列表
    register(moduleNameList,moduleOptions){
        let newModule = {
            _raw:moduleOptions,
            state:moduleOptions.state,
            _children:{}
        }
        // 判斷l(xiāng)ist身上是否是空的 如果是空的就讓根module為newModule
        if(moduleNameList.length === 0){
            this.root = newModule;
        }else{
            // 查找對應(yīng)父屬性 ,在父屬性中每一個(gè)子屬性改為 newModule 樣式
            let parent = moduleNameList.slice(0,-1).reduce((root,current)=>{
                // 返回moduleNameList中 倒數(shù)第二個(gè)元素的屬性
                // 使用reduce遞歸去找 找到倒數(shù)第二個(gè)元素
                return root._children[current];
            },this.root)
            // 父元素的children數(shù)組里面的最后一個(gè)元素 為newModule
            parent._children[moduleNameList[moduleNameList.length-1]] = newModule;
        }
        if(moduleOptions.module){
            Object.keys(moduleOptions.module).forEach((item)=>{ // item 分別為 a,c晚吞,b
                // 遞歸調(diào)用
                // moduleNameList 分別為 item為a時(shí) [],item為c時(shí) [a]灸撰,item為b時(shí) []
                // moduleNameList.concat(item)  [a]        [a,c]        [b]
                this.register(moduleNameList.concat(item),moduleOptions.module[item]);
            })
        }
    }
}
console.log(new ModuleCollect(obj))

register的原理 就是將傳遞的不規(guī)則參數(shù)挪捕,改為指定格式用于后續(xù)用途 Vuex中大多數(shù)使用該種遞歸方式實(shí)現(xiàn)遞歸

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粗梭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子级零,更是在濱河造成了極大的恐慌断医,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孩锡,居然都是意外死亡酷宵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門躬窜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浇垦,“玉大人,你說我怎么就攤上這事荣挨∧腥停” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵默垄,是天一觀的道長此虑。 經(jīng)常有香客問我,道長口锭,這世上最難降的妖魔是什么朦前? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮鹃操,結(jié)果婚禮上韭寸,老公的妹妹穿的比我還像新娘。我一直安慰自己荆隘,他們只是感情好恩伺,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著椰拒,像睡著了一般晶渠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上燃观,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天褒脯,我揣著相機(jī)與錄音,去河邊找鬼缆毁。 笑死憨颠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的积锅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼养盗,長吁一口氣:“原來是場噩夢啊……” “哼缚陷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起往核,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤箫爷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虎锚,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡硫痰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窜护。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片效斑。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柱徙,靈堂內(nèi)的尸體忽然破棺而出缓屠,到底是詐尸還是另有隱情,我是刑警寧澤护侮,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布敌完,位于F島的核電站,受9級(jí)特大地震影響羊初,放射性物質(zhì)發(fā)生泄漏滨溉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一长赞、第九天 我趴在偏房一處隱蔽的房頂上張望晦攒。 院中可真熱鬧,春花似錦涧卵、人聲如沸勤家。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伐脖。三九已至,卻和暖如春乐设,著一層夾襖步出監(jiān)牢的瞬間讼庇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工近尚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蠕啄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓戈锻,卻偏偏與公主長得像歼跟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子格遭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 上一章總結(jié)了 Vuex 的框架原理哈街,這一章我們將從 Vuex 的入口文件開始,分步驟閱讀和解析源碼拒迅。由于 Vuex...
    你的肖同學(xué)閱讀 1,790評論 3 16
  • 前言 之前幾篇解析 Vue 源碼的文章都是完整的分析整個(gè)源碼的執(zhí)行過程骚秦,這篇文章我會(huì)將重點(diǎn)放在核心原理的解析她倘,不會(huì)...
    心_c2a2閱讀 1,473評論 1 8
  • Vuex源碼閱讀分析 Vuex是專為Vue開發(fā)的統(tǒng)一狀態(tài)管理工具。當(dāng)我們的項(xiàng)目不是很復(fù)雜時(shí)作箍,一些交互可以通過全局事...
    steinslin閱讀 639評論 0 6
  • 這幾天忙啊硬梁,有絕地求生要上分,英雄聯(lián)盟新賽季需要上分胞得,就懶著什么也沒寫荧止,很慚愧。這個(gè)vuex,vue-router...
    公子世無雙ss閱讀 619評論 0 0
  • 寫在前面 因?yàn)閷ue.js很感興趣懒震,而且平時(shí)工作的技術(shù)棧也是Vue.js罩息,這幾個(gè)月花了些時(shí)間研究學(xué)習(xí)了一下Vue...
    染陌同學(xué)閱讀 1,672評論 0 12