如何在 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使用与区别
1786 0
|
负载均衡 安全 应用服务中间件
什么是正向代理和反向代理
正向代理是客户端与服务端之间的中介,用于访问受限资源,如V/P/N和动态IP代理,同时可隐藏客户端IP。反向代理则接收客户端请求并转发给后端服务器集群,隐藏真实服务器信息,常用于堡垒机和负载均衡,如nginx。正向代理焦点在客户端,反向代理关注服务端。
|
存储 移动开发 小程序
【uniapp小程序】上传图片
【uniapp小程序】上传图片
3070 0
【uniapp小程序】上传图片
|
小程序 开发者
HBuilderX运行uniapp到微信开发者工具常见报错
HBuilderX运行uniapp到微信开发者工具常见报错
3685 0
vue2自定义指令-加载指令v-loading和占位图指令v-showimg
vue2自定义指令-加载指令v-loading和占位图指令v-showimg
|
4月前
|
人工智能 JavaScript BI
用 AI 编程生成 ECharts 图表
报表内置图表有限,复杂图表(如K线图、地图等)需手写ECharts代码,学习成本高、调试耗时。本文以K线图为例,介绍“参数导出→AI生成→脚本回填”三步法:用Trae等AI工具根据报表导出的参数自动生成JS脚本,再替换嵌入报表模板,大幅提升开发效率。(239字)
|
存储 缓存
sessionStorage和localStorage的区别
sessionStorage和localStorage的区别
588 0
|
资源调度 JavaScript 前端开发
Vue2项目使用v-viewer插件实现图片预览、切换、缩放、旋转...
这篇文章介绍了在Vue 2项目中如何通过`v-viewer`插件实现图片的预览、切换、缩放、旋转等功能,并提供了插件的安装、配置和使用方法。
5618 0
Vue2项目使用v-viewer插件实现图片预览、切换、缩放、旋转...
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
983 3
|
前端开发 JavaScript
Vue2瀑布流图片展示(Waterfall)
这篇文章介绍了如何在Vue 3框架中实现瀑布流图片展示组件,提供了两种实现方式:一种使用CSS的`column-count`和`column-gap`属性,另一种使用JavaScript计算图片位置,以实现图片在多列中的动态分布。
1201 2
Vue2瀑布流图片展示(Waterfall)

热门文章

最新文章