Skip to content

模块动态注册 ​

本节目标:理解“模块动态注册”的核心思路,并能把它用于实际开发或面试表达。 在 store 创建之后,你可以使用 store.registerModule 方法注册模块: import Vuex from 'vuex' const store = new Vuex.Store({ /* 选项 */ }) // 注册模块 myModule store.registerModule('myModule', { // ... }) // 注册嵌套模块 nested/myModule store.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 或模块间数据互相污染的问题。 实际上这和 Vue 组件内的 data 是同样的问题。因此解决办法也是相同的——使用一个函数来声明模块状态(仅 2.3.0+ 支持):

const MyReusableModule = {  state: () => ({    foo: 'bar'  }),  // mutation, action

和 getter 等等

...}

> 来自

 <https://vuex.vuejs.org/zh/guide/modules.html>

本站总访问 — 次