Appearance
模块动态注册
本节目标:理解“模块动态注册”的核心思路,并能把它用于实际开发或面试表达。 在
store创建之后,你可以使用store.registerModule方法注册模块: import Vuex from 'vuex' const store = new Vuex.Store({ /* 选项 */ }) // 注册模块myModulestore.registerModule('myModule', { // ... }) // 注册嵌套模块nested/myModulestore.registerModule(['nested', 'myModule'], { // ... }) 之后就可以通过store.state.myModule和store.state.nested.myModule访问模块的状态。
模块动态注册功能使得其他 Vue 插件可以通过在 store 中附加新模块的方式来使用 Vuex 管理状态。例如,
vuex-router-sync插件就是通过动态注册模块将 vue-router 和 vuex 结合在一起,实现应用的路由状态管理。 你也可以使用 store.unregisterModule(moduleName) 来动态卸载模块。注意,你不能使用此方法卸载静态模块(即创建 store 时声明的模块)。 注意,你可以通过 store.hasModule(moduleName) 方法检查该模块是否已经被注册到 store。
保留 state 在注册一个新 module 时,你很有可能想保留过去的 state,例如从一个服务端渲染的应用保留 state。你可以通过 preserveState 选项将其归档:store.registerModule('a', module, { preserveState: true })。 当你设置 preserveState: true 时,该模块会被注册,action、mutation 和 getter 会被添加到 store 中,但是 state 不会。这里假设 store 的 state 已经包含了这个 module 的 state 并且你不希望将其覆写。
模块重用 有时我们可能需要创建一个模块的多个实例,例如:
- 创建多个
store,他们公用同一个模块(例如当runInNewContext选项是false或'once'时,为了在服务端渲染中避免有状态的单例) - 在一个
store中多次注册同一个模块
如果我们使用一个纯对象来声明模块的状态,那么这个状态对象会通过引用被共享,导致状态对象被修改时 store 或模块间数据互相污染的问题。 实际上这和 Vue 组件内的 data 是同样的问题。因此解决办法也是相同的——使用一个函数来声明模块状态(仅 2.3.0+ 支持):
const MyReusableModule = { state: () => ({ foo: 'bar' }), // mutation, action和 getter 等等
...}> 来自
<https://vuex.vuejs.org/zh/guide/modules.html>