Browse Source

tweak initialization logic

Evan You 8 years ago
parent
commit
777b2b12dc
1 changed files with 53 additions and 55 deletions
  1. 53 55
      src/index.js

+ 53 - 55
src/index.js

@@ -37,13 +37,14 @@ class Store {
     // strict mode
     this.strict = strict
 
-    // init internal vm with root state
-    // other options and sub modules will be
-    // initialized in this.module method
-    initStoreVM(this, state, {})
+    // init root module.
+    // this also recursively registers all sub-modules
+    // and collects all module getters inside this._wrappedGetters
+    initModule(this, state, [], options)
 
-    // apply root module
-    this.registerModule([], options)
+    // initialize the store vm, which is responsible for the reactivity
+    // (also registers _wrappedGetters as computed properties)
+    initStoreVM(this, state, this._wrappedGetters)
 
     // apply plugins
     plugins.concat(devtoolPlugin).forEach(plugin => plugin(this))
@@ -63,52 +64,6 @@ class Store {
     this._committing = false
   }
 
-  registerModule (path, module, hot) {
-    this._committing = true
-    if (typeof path === 'string') path = [path]
-    assert(Array.isArray(path), `module path must be a string or an Array.`)
-
-    initModule(this, path, module, hot)
-
-    initStoreVM(this, this.state, this._wrappedGetters)
-
-    this._committing = false
-  }
-
-  registerMutation (type, handler, path = []) {
-    const entry = this._mutations[type] || (this._mutations[type] = [])
-    const store = this
-    entry.push(function wrappedMutationHandler (payload) {
-      handler(getNestedState(store.state, path), payload)
-    })
-  }
-
-  registerAction (type, handler, path = []) {
-    const entry = this._actions[type] || (this._actions[type] = [])
-    const store = this
-    const { dispatch, commit } = this
-    entry.push(function wrappedActionHandler (payload, cb) {
-      let res = handler({
-        dispatch,
-        commit,
-        getters: store.getters,
-        state: getNestedState(store.state, path),
-        rootState: store.state
-      }, payload, cb)
-      if (!isPromise(res)) {
-        res = Promise.resolve(res)
-      }
-      if (store._devtoolHook) {
-        return res.catch(err => {
-          store._devtoolHook.emit('vuex:error', err)
-          throw err
-        })
-      } else {
-        return res
-      }
-    })
-  }
-
   commit (type, payload) {
     // check object-style commit
     let mutation
@@ -172,6 +127,49 @@ class Store {
     return this._vm.$watch(() => getter(this.state), cb, options)
   }
 
+  registerModule (path, module, hot) {
+    this._committing = true
+    if (typeof path === 'string') path = [path]
+    assert(Array.isArray(path), `module path must be a string or an Array.`)
+    initModule(this, this.state, path, module, hot)
+    initStoreVM(this, this.state, this._wrappedGetters)
+    this._committing = false
+  }
+
+  registerMutation (type, handler, path = []) {
+    const entry = this._mutations[type] || (this._mutations[type] = [])
+    const store = this
+    entry.push(function wrappedMutationHandler (payload) {
+      handler(getNestedState(store.state, path), payload)
+    })
+  }
+
+  registerAction (type, handler, path = []) {
+    const entry = this._actions[type] || (this._actions[type] = [])
+    const store = this
+    const { dispatch, commit } = this
+    entry.push(function wrappedActionHandler (payload, cb) {
+      let res = handler({
+        dispatch,
+        commit,
+        getters: store.getters,
+        state: getNestedState(store.state, path),
+        rootState: store.state
+      }, payload, cb)
+      if (!isPromise(res)) {
+        res = Promise.resolve(res)
+      }
+      if (store._devtoolHook) {
+        return res.catch(err => {
+          store._devtoolHook.emit('vuex:error', err)
+          throw err
+        })
+      } else {
+        return res
+      }
+    })
+  }
+
   hotUpdate (newOptions) {
     this._actions = Object.create(null)
     this._mutations = Object.create(null)
@@ -240,7 +238,7 @@ function initStoreVM (store, state, getters) {
   }
 }
 
-function initModule (store, path, module, hot) {
+function initModule (store, rootState, path, module, hot) {
   const isRoot = !path.length
   const {
     state,
@@ -252,7 +250,7 @@ function initModule (store, path, module, hot) {
 
   // set state
   if (!isRoot && !hot) {
-    const parentState = getNestedState(store.state, path.slice(0, -1))
+    const parentState = getNestedState(rootState, path.slice(0, -1))
     const moduleName = path[path.length - 1]
     Vue.set(parentState, moduleName, state || {})
   }
@@ -275,7 +273,7 @@ function initModule (store, path, module, hot) {
 
   if (modules) {
     Object.keys(modules).forEach(key => {
-      initModule(store, path.concat(key), modules[key], hot)
+      initModule(store, rootState, path.concat(key), modules[key], hot)
     })
   }
 }