Skip to content

一、 vuex 缓存方案

vuex 是全局状态管理,它采用集中式存储应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

1. 基本使用【推荐写法】

  • 当需要过滤数据的时候,请优先使用 getters
  • 推荐使用 vuex 提供的相关辅助函数进行获取和更改
  • 推荐开启严格模式:无论何时发生了状态变更且不是由 mutation 函数引起的,将会抛出错误。这能保证所有的状态变更都能被调试工具跟踪到。
  • 不要在发布环境下启用严格模式!严格模式会深度监测状态树来检测不合规的状态变更——请确保在发布环境下关闭严格模式,以避免性能损失。
    typescript
    const store = createStore({
    // ...
    strict: process.env.NODE_ENV !== 'production'
    })

2. 结构搭建【官网推荐结构】

text
store
├── index.js          # 组装模块并导出 store 的地方
├── actions.js        # 根级别的 action
├── mutations.js      # 根级别的 mutation
└── modules
├── cart.js       # 购物车模块
└── products.js   # 产品模块
  • 一些遵守的规则:

    • 应用层级的状态应该集中到单个 store 对象中。
    • 提交 mutation 是更改状态的唯一方法,并且这个过程是同步的。
    • 异步逻辑都应该封装到 action 里面。
  • 本模板采用的是将 actions mutations 都封装到各自的模块中

3. 多模块自动化注册

  • 在 store 文件夹中新建 index.ts
    typescript
    import { createStore } from 'vuex'; 
    
    interface ModuleObj {
      [moduleName: string]: any
    }
    
    // 动态模块注册
    const modulesFiles = require.context('./modules', false, /\.ts$/);
    const modules = modulesFiles.keys().reduce((modules: ModuleObj, modulePath) => {
    const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1');
    const module = modulesFiles(modulePath);
    modules[moduleName] = module.default;
      return modules
    }, {})
    
    export default createStore({
      modules,
    });

4. 解决刷新页面,vuex中的数据丢失的问题

在用vuex管理状态的时候发现state数据每次刷新都会清空, 这是因为数据是存储在内存中的,所以我们必须把它保存在 sessionStorage 、localStorage 或者cookie中等

1. 利用 session 或者 localStorage

  • 在 mutations 的时候,将数据存储想要存储的缓存中
  • 读取的时候,从缓存中读取,比如:在 state 直接从缓存中拿取数据

2. 利用根节点每次都加载的特性,缺点:每次都需要加载,消耗带宽

3.题外:使用 vuex-persistedstate,但是该项目已经不再维护了,所以放弃

Released under the MIT License.