如何在 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 状态在页面刷新后的持久化保存。

目录
相关文章
|
JavaScript
VUE里的find与filter使用与区别
VUE里的find与filter使用与区别
1722 0
|
存储 移动开发 小程序
【uniapp小程序】上传图片
【uniapp小程序】上传图片
2954 0
【uniapp小程序】上传图片
|
负载均衡 安全 应用服务中间件
什么是正向代理和反向代理
正向代理是客户端与服务端之间的中介,用于访问受限资源,如V/P/N和动态IP代理,同时可隐藏客户端IP。反向代理则接收客户端请求并转发给后端服务器集群,隐藏真实服务器信息,常用于堡垒机和负载均衡,如nginx。正向代理焦点在客户端,反向代理关注服务端。
|
小程序 开发者
HBuilderX运行uniapp到微信开发者工具常见报错
HBuilderX运行uniapp到微信开发者工具常见报错
3506 0
vue2自定义指令-加载指令v-loading和占位图指令v-showimg
vue2自定义指令-加载指令v-loading和占位图指令v-showimg
|
11月前
|
存储 缓存
sessionStorage和localStorage的区别
sessionStorage和localStorage的区别
547 0
|
资源调度 JavaScript 前端开发
Vue2项目使用v-viewer插件实现图片预览、切换、缩放、旋转...
这篇文章介绍了在Vue 2项目中如何通过`v-viewer`插件实现图片的预览、切换、缩放、旋转等功能,并提供了插件的安装、配置和使用方法。
5466 0
Vue2项目使用v-viewer插件实现图片预览、切换、缩放、旋转...
|
存储 移动开发 JavaScript
vuex的工作流程,模块化使用案例分享,及状态持久化
vuex的工作流程,模块化使用案例分享,及状态持久化
400 0
【vue2】切换页面之后滚动条停留在上个页面的位置,解决方案
【vue2】切换页面之后滚动条停留在上个页面的位置,解决方案
1139 6