如何在 Vuex 中使用插件进行状态持久化?

简介: 如何在 Vuex 中使用插件进行状态持久化?

在 Vuex 中实现状态持久化(如页面刷新后保留状态),最常用的方式是使用成熟的插件 vuex-persistedstate。以下是具体实现步骤:

1. 安装插件

首先安装 vuex-persistedstate

npm install vuex-persistedstate --save
# 或
yarn add vuex-persistedstate

2. 基本使用(默认存储到 localStorage)

在创建 Vuex Store 时引入并使用插件,默认会将所有状态持久化到 localStorage

import Vue from 'vue';
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate';

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    user: null, // 需要持久化的用户信息
    token: '',  // 需要持久化的令牌
    count: 0    // 非持久化状态(可配置排除)
  },
  mutations: {
    setUser(state, user) {
      state.user = user;
    },
    setToken(state, token) {
      state.token = token;
    },
    increment(state) {
      state.count++;
    }
  },
  // 引入持久化插件
  plugins: [
    createPersistedState() // 默认存储到 localStorage
  ]
});

export default store;

3. 高级配置(自定义存储方式和范围)

如果需要自定义存储位置(如 sessionStorage)、指定需要持久化的状态或排除某些状态,可以通过配置参数实现:


import Vue from 'vue';
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate';

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    user: null,
    token: '',
    count: 0,
    tempData: '' // 临时数据,不需要持久化
  },
  mutations: { /* ... */ },
  plugins: [
    createPersistedState({
      // 1. 自定义存储方式(默认 localStorage)
      storage: window.sessionStorage, // 改为 sessionStorage

      // 2. 指定需要持久化的状态(只持久化 user 和 token)
      reducer: (state) => ({
        user: state.user,
        token: state.token
      }),

      // 3. 自定义存储的 key(默认是 'vuex')
      key: 'my-app-state',

      // 4. 过滤 mutation(只在特定 mutation 后持久化)
      filter: (mutation) => {
        // 只在执行 setUser 或 setToken 后持久化
        return ['setUser', 'setToken'].includes(mutation.type);
      }
    })
  ]
});

export default store;

4. 模块化状态的持久化

如果使用 Vuex 模块化(modules),可以通过 paths 指定需要持久化的模块或模块内的状态:


import Vue from 'vue';
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate';

// 定义用户模块
const userModule = {
  state: () => ({
    info: null,
    roles: []
  }),
  mutations: { /* ... */ }
};

// 定义购物车模块
const cartModule = {
  state: () => ({
    items: []
  }),
  mutations: { /* ... */ }
};

const store = new Vuex.Store({
  modules: {
    user: userModule,
    cart: cartModule
  },
  plugins: [
    createPersistedState({
      // 只持久化 user 模块的 info 和 cart 模块的 items
      paths: ['user.info', 'cart.items']
    })
  ]
});

export default store;

5. 实现原理说明

vuex-persistedstate 的核心逻辑是:

  1. 通过 Vuex 插件的 store.subscribe 监听 mutation 触发。
  2. 在状态变更后,将指定的状态数据序列化(JSON.stringify)并存储到 localStoragesessionStorage
  3. 在 store 初始化时,从存储中读取数据并通过 store.replaceState 恢复状态。

注意事项

  • 性能影响:频繁修改的状态(如计数器)不建议持久化,避免频繁读写存储。
  • 数据类型限制localStorage 只能存储字符串,复杂类型(如 Date、RegExp)会被序列化丢失类型,需手动处理。
  • 安全性:敏感信息(如 token)存储到 localStorage 有 XSS 风险,可考虑加密或使用 httpOnly Cookie。

通过上述配置,即可实现 Vuex 状态在页面刷新后的持久化保存。

目录
相关文章
|
存储 移动开发 小程序
【uniapp小程序】上传图片
【uniapp小程序】上传图片
2564 0
【uniapp小程序】上传图片
|
小程序 开发者
HBuilderX运行uniapp到微信开发者工具常见报错
HBuilderX运行uniapp到微信开发者工具常见报错
2939 0
|
人工智能 JavaScript 前端开发
Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
794 3
|
存储 移动开发 JavaScript
vuex的工作流程,模块化使用案例分享,及状态持久化
vuex的工作流程,模块化使用案例分享,及状态持久化
348 0
|
缓存 JavaScript 前端开发
vue2进阶篇:vue-router之嵌套(多级)路由
vue2进阶篇:vue-router之嵌套(多级)路由
513 3
|
前端开发
MVVM是什么?和MVC有何区别呢?
【10月更文挑战第11天】MVVM 和 MVC 都是为了更好地组织和管理软件架构,提高开发效率和代码质量。理解它们的特点和区别,有助于我们在实际开发中做出更合适的选择,并构建出更加优秀的应用程序。
|
JavaScript API 索引
js中的reduce()方法 讲解 和实现
`reduce()` 方法对数组元素依次应用一个回调函数,将结果累计并最终返回单一值。语法为 `reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)`。参数包括累计器(初次为初始值或首元素)、当前元素值、索引及数组自身。此方法需返回值供下一轮迭代使用。常见应用场景包括计算数组总和与平均值、统计元素频率、过滤与转换数组内容及去除重复项等。例如,可通过 `reduce()` 快速计算 `[1, 2, 3, 4, 5]` 的总和或对对象属性值求和。此外,还可自定义实现 `reduce()` 方法
7141 1
|
JavaScript
elementUI/Plus 输入框按回车刷新页面分析与解决
elementUI/Plus 输入框按回车刷新页面分析与解决
elementUI/Plus 输入框按回车刷新页面分析与解决
|
前端开发
CSS Reset或Normalize.css
CSS Reset或Normalize.css

热门文章

最新文章