vuex项目回顾和使用 - 实践篇

88 阅读2分钟

项目使用 vuex 做数据共享和管理。忙于业务开发时,只关注如何使用,却没想过为何使用

现在有时间做总结了,在此记录一下。

总结共分三篇:基础篇和原理篇、实践篇、思考篇。建议先浏览一下思考篇的几个问题,再回看基础篇。

本文关注问题速览:

  • 项目如何使用 vuex

    • 拆分 store 时,我在想什么
    • require.context 维护 module
    • 结合 devtool 追踪 state

项目如何使用 vuex

本文介绍三点:

  • 拆分 store 时,我在想什么
  • require.context 维护 module
  • 结合 devtool 追踪 state 变化

拆分 store 时,我在想什么?

随着项目添加的模块增多,需要借助 store 共享的数据越来越多,单个 store 文件逐渐臃肿难维护。module 拆分工作迟早要做了。

笔者并没有立即开始敲代码,而是先分析了下当前需要维护的 module ,考虑了以下几点:

  • 解耦 - 依赖 store 的功能模块有哪些?能直接放到组件内部维护的有哪些?
  • 重组 - 剩下需要拆分的 module 之间,是否有关联(比如 actionA 内部调用 actionB, actionC 调用成功后执行 actionD),这些关联关系是否应该放到一个module下维护?

经历了上述的分析和实际拆分工作后,发现还是存在过于臃肿的 module。

这时候考虑再细化拆分,一个 module.js 文件拆成四个文件 state.js, getters.js, mutations.js, action.js

如何将上述四份文件整合到 module 中变成要解决的问题。项目中使用了require.context。

store 目录层级举例: image.png

使用 require.context ,自动维护 module

require.context 是 Webpack 封装函数,用于创建自己的 context。

代码用这个方法获取 module 文件夹下的各级文件,并维护到全局modules中。 (代码还需要优化,只着急实现了功能。)

import _ from 'lodash'
const files = require.context('.', true, /.js$/)
const modules = {}
files.keys().forEach(key => {
  if (key === './index.js') return
  const path = key.replace(/(./|.js)/g, '')
  const [namespace, imported, modulesNamespace, modulesImported] = path.split('/')
  if (imported !== 'modules') {
    if (!modules[namespace]) {
      modules[namespace] = {
        namespaced: true
      }
    }
    modules[namespace][imported] = files(key).default
  } else {
    modulesImported
      ? _.set(
          modules,
          `${namespace}.${imported}.${modulesNamespace}.${modulesImported}`,
          files(key).default
        )
      : _.set(modules, `${namespace}.${imported}.${modulesNamespace}`, files(key).default)
  }
})
export default modules

结合 devtool 追踪 state 变化

参考 文档

devtools - vuex 常用功能介绍:

1 - 回到指定 store 快照

2 - 回退指定 store 快照

3 | 8 - 合并指定 | 所有 mutation

4 | 5 - 导入 | 导出 store

6 - 是否继续记录 mutations

7 - 清空 store, state 初始化。近似刷新页面的效果。

image.png