Răsfoiți Sursa

fix: Warn about conflicts between state and module (#1365)

* feat: warn about conflicts between state and module

* fix: show module path when it overwrite a state field
Denis Karabaza 5 ani în urmă
părinte
comite
538ee5803b
2 a modificat fișierele cu 29 adăugiri și 0 ștergeri
  1. 7 0
      src/store.js
  2. 22 0
      test/unit/modules.spec.js

+ 7 - 0
src/store.js

@@ -315,6 +315,13 @@ function installModule (store, rootState, path, module, hot) {
     const parentState = getNestedState(rootState, path.slice(0, -1))
     const moduleName = path[path.length - 1]
     store._withCommit(() => {
+      if (process.env.NODE_ENV !== 'production') {
+        if (moduleName in parentState) {
+          console.warn(
+            `[vuex] state field "${moduleName}" was overridden by a module with the same name at "${path.join('.')}"`
+          )
+        }
+      }
       Vue.set(parentState, moduleName, module.state)
     })
   }

+ 22 - 0
test/unit/modules.spec.js

@@ -547,6 +547,28 @@ describe('Modules', () => {
       store.dispatch('parent/test')
     })
 
+    it('module: warn when module overrides state', () => {
+      spyOn(console, 'warn')
+      const store = new Vuex.Store({
+        modules: {
+          foo: {
+            state () {
+              return { value: 1 }
+            },
+            modules: {
+              value: {
+                state: () => 2
+              }
+            }
+          }
+        }
+      })
+      expect(store.state.foo.value).toBe(2)
+      expect(console.warn).toHaveBeenCalledWith(
+        `[vuex] state field "value" was overridden by a module with the same name at "foo.value"`
+      )
+    })
+
     it('dispatching multiple actions in different modules', done => {
       const store = new Vuex.Store({
         modules: {