各位看官 沒看過脈絡梳理的能夠先閱讀下
Vuex源碼學習(二)脈絡梳理.vue
在Vue插件如何被註冊到Vue上呢?
使用usevuex
// 正確的註冊插件方式: Vue.use(Vuex); // 這裏會執行Vuex的install方法。
咱們來看一下install函數的代碼segmentfault
這塊一共作了兩件事情:app
先解決兩個小問題
_Vue是什麼?框架
_Vue是註冊插件時,被傳遞進來的Vue構造函數,函數
爲何聲明Vue變量?
聲明Vue這個變量的意義是在Vuex內部不引入Vue這個構造函數(Vue框架的代碼),
而是等待Vue.use(Vuex)以後把外部引入的Vue對象傳遞進去。
給Vue對象的賦值操做只有在install函數內,因此Vue變量存在而且等於_Vue(這個外部傳遞進來的Vue構造函數)的話,表明Vuex已經完成了install,
就會有一個提示。學習
引起想法
註冊Vuex插件與實例化Vuex.Store構造函數前後順序ui
Vue.use(Vuex) export default new Vuex.Store({ state : { tryData : 'recruitment', }, modules : { list : moduleList, set : moduleSet } }); // 沒有問題
export default new Vuex.Store({ state : { tryData : 'recruitment', }, modules : { list : moduleList, set : moduleSet } }); Vue.use(Vuex) //會報錯
安裝作了什麼就要去看applyMixin函數作了什麼this
上代碼spa
核心 -> vuexInit
我沒有使用過Vue1.0版本,因此就對Vue2.0版本進行一個解釋吧,
if (version >= 2) { // 2.0版本以上 經過mixin的方式在每一個Vue對象的beforeCreate生命週期執行的時候完成vuex初始化 Vue.mixin({ beforeCreate: vuexInit }) }
function vuexInit () { // 獲取當前Vue對象的options const options = this.$options // store injection // 根結點對象的options上會被掛載store,在new Vue的時候作的 if (options.store) { // 把根結點上的store傳遞給組件的$store屬性上,訪問的是同一個對象 this.$store = typeof options.store === 'function' ? options.store() : options.store } else if (options.parent && options.parent.$store) { // 不是根結點,那麼從這個節點的父節點上拿到$store傳遞給子節點 // Vue這個組件樹是從根結點向下一層一層的生成Vue對象的,因此根結點有根結點的兒子節點就會有$store屬性, //同理這些節點的子節點也會有$store, //最後每個Vue的實例對象都會有$store屬性, //所有都指向同一個對象,就是那個被實例化的Vuex內的store對象。 this.$store = options.parent.$store } }
Vuex註冊的時候,必需要暴露出這個方法,供Vue使用。
判斷Vuex是否已經註冊,註冊過就再也不註冊,
Vue2.0給每一個Vue組件的beforeCreate生命週期中增長vuexInit函數,
給每一個Vue組件上掛載一個$store對象,所有都指向Vuex的Store實例化的對象。
下一章講述ModuleCollection類作了什麼