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

目录
相关文章
|
10月前
|
人工智能 JavaScript 前端开发
Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
707 3
|
缓存 JavaScript 前端开发
vue2进阶篇:vue-router之嵌套(多级)路由
vue2进阶篇:vue-router之嵌套(多级)路由
455 3
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
3116 1
|
前端开发 JavaScript 容器
在 vite+vue 中使用@originjs/vite-plugin-federation 模块联邦
【10月更文挑战第25天】模块联邦是一种强大的技术,它允许将不同的微前端模块组合在一起,形成一个统一的应用。在 vite+vue 项目中,使用@originjs/vite-plugin-federation 模块联邦可以实现高效的模块共享和组合。通过本文的介绍,相信你已经了解了如何在 vite+vue 项目中使用@originjs/vite-plugin-federation 模块联邦,包括安装、配置和使用等方面。在实际开发中,你可以根据自己的需求和项目的特点,灵活地使用模块联邦,提高项目的可维护性和扩展性。
|
存储 缓存 前端开发
灵魂拷问-前端的作用--性能优化篇
作者最近在尝试对负责的平台进行性能优化,本文整理了些前端性能优化的一些常见策略。
|
移动开发 API UED
【专栏:HTML进阶篇】HTML5拖放API与触摸事件
【4月更文挑战第30天】HTML5的拖放API和触摸事件增强了网页交互设计,使开发者能创建动态响应式界面。拖放API通过设定元素的`draggable`属性、监听拖动和放置事件以及处理`DataTransfer`对象实现。触摸事件如`touchstart`、`touchmove`、`touchend`则让触控设备操作更流畅。开发者需注意事件对象、多点触控处理和防止默认行为。结合两者,可创建图片排序、手势识别等交互功能,但也需面对浏览器兼容性和复杂逻辑挑战。利用HTML5这些工具,能提升用户体验,推动网页交互设计创新。
419 0
|
前端开发
如何实现CSS中flex布局最后一行左对齐?
前言 flex布局目前已经非常流行了,它基本上可以完成大部分的布局需求。早一些的float布局、表格布局等等便没有那么受欢迎了。但是任何事物都不是完美的,flex布局也一样,它也有瑕疵,就比如我们今天所要讲的flex布局中最后一行对齐问题。
2875 0
如何实现CSS中flex布局最后一行左对齐?
|
资源调度 JavaScript 前端开发
Vue2项目使用v-viewer插件实现图片预览、切换、缩放、旋转...
这篇文章介绍了在Vue 2项目中如何通过`v-viewer`插件实现图片的预览、切换、缩放、旋转等功能,并提供了插件的安装、配置和使用方法。
4419 0
Vue2项目使用v-viewer插件实现图片预览、切换、缩放、旋转...
|
JavaScript Linux iOS开发
详解如何实现自由切换Node.js版本
不同的项目中需要使用不同版本的 Node.js,有时旧项目需要旧版本,而新项目则可能依赖最新的 Node.js 版本
2225 0

热门文章

最新文章