Vuex持久化

本文介绍了如何使用vuex-persistedstate插件实现Vuex中数据的自动持久化存储,详细步骤包括安装插件、定义要存储的Vuex状态、在store的index中导入并配置,以及说明数据默认存储在localStorage中的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用插件让在vuex中管理的状态数据自动同时存储在本地免去自己存储的环节

1.安装vuex-persistedstate插件

npm i vuex-persistedstate


2.vuex中准备要存储的数据


例如:

在src/store 文件夹下新建 modules 文件,在 modules 下新建 user.js 和 cart.js

// 用户状态
export default {
  namespaced: true,
  state: () => {
    return {
      profile: {
        id: '',
        nickname: '',
        avatar: '',
        token: '',
        mobile: ''
      }
    }
  }
}
// 购物车状态
export default {
  namespaced: true,
  state: () => {
    return {
      list: []
    }
  }
}

3.在store下的index中导入

import { createStore } from 'vuex'
 
import user from './modules/user'
import cart from './modules/cart'
 
export default createStore({
  modules: {
    user,
    cart
  }
})

4.使用vuex-persistedstate插件来进行持久化

import { createStore } from 'vuex'
import createPersistedstate from 'vuex-persistedstate'
 
import user from './modules/user'
import cart from './modules/cart'
 
export default createStore({
  modules: {
    user,
    cart
  },
  plugins: [
    createPersistedstate({
      key: 'erabbit-client-pc-store',
      paths: ['user', 'cart']
    })
  ]
})

说明

  1. 默认是存储在localStorage中

  2. key是存储数据的键名

  3. paths是存储state中的那些数据,如果是模块下具体的数据需要加上模块名称,如user.token

  4. 修改state后触发才可以看到本地存储数据的的变化

手动保存token和vuex中的数据

// 封装本地存储,以后改的话,直接在这边改
// 取值
export const getStorage = key => localStorage.getItem(key)
// 赋值
export const setStorage = (key, value) => localStorage.setItem(key, value)
// 清空
export const clearStorage = () => localStorage.clear()
// 移除
export const removeStorage = key => localStorage.removeItem(key)
 
export default {
  getStorage,
  setStorage,
  clearStorage,
  removeStorage
}

// vuex的变量
import { setStorage, getStorage } from '../utils/storage'
export default {
  // 开启命名空间
  namespaced: true,
  state () {
    return {
      token: getStorage('token'),
      refresh_token: getStorage('refresh_token'),
      user: {}, // 用户基本资料
      userProfile: {} // 用户的简介
    }
  },
  mutations: {
    setRefreshToken (state, refreshToken) {
      state.refresh_token = refreshToken
      // 给vuex存token值的时候,随便给本地存一份
      setStorage('refresh_token', refreshToken)
    },
    setToken (state, token) {
      state.token = token
      // 给vuex存token值的时候,随便给本地存一份
      setStorage('token', token)
    },
    setUser (state, payload) {
      state.user = payload
    },
    setuserProfile (state, payload) {
      state.userProfile = payload
    },
    clearUser (state) {
      state.token = ''
      state.refresh_token = ''
      state.user = {}
      state.userProfile = {}
    }
  }
}

### 实现 Vuex 状态管理持久化最佳实践 为了确保 Vuex 中的状态可以在页面刷新后仍然保持不变,通常采用本地存储机制如 `localStorage` 或者 `sessionStorage` 来保存状态。下面介绍一种常见的做法: #### 使用插件简化操作 可以利用现有的社区插件来帮助完成这一功能,比如 `vuex-persistedstate` 插件能够轻松地将 Vuex 的 store 数据同步至浏览器的 localStorage。 安装该库可以通过 npm 安装命令: ```bash npm install vuex-persistedstate --save ``` 接着,在创建 Vuex Store 时引入此模块并配置它: ```javascript import createPersistedState from 'vuex-persistedstate' const store = new Vuex.Store({ plugins: [createPersistedState()], state: { // 初始状态... }, mutations: { // 变更函数... } }) ``` 这样设置之后,每当 Vuex 发生改变都会自动更新到本地存储;当重新加载网页时也会尝试从本地恢复之前的数据[^1]。 对于某些特定场景下可能不需要全部都缓存下来,则可通过 options 参数来自定义哪些属性应该被持久化以及选择不同的 storage 方式(例如 sessionStorage)。另外还可以指定 key 名字用于区分多个项目共存的情况。 #### 手动实现简易版持久化逻辑 如果不希望依赖第三方库也可以自己编写简单的代码片段来进行相同的功能开发。这里给出一个基础版本的例子作为参考: 在每次提交 mutation 后手动调用一次 save 方法将当前最新的状态序列化成 JSON 字符串形式存入 localstorage 中; 而在初始化阶段读取对应键名下的值反序列化还原给初始状态对象即可。 ```javascript // 在 main.js 文件里加入如下代码 new Vue({ ... created () { const savedStateStr = window.localStorage.getItem('app-state') if (savedStateStr) this.$store.replaceState(Object.assign({}, this.$store.state, JSON.parse(savedStateStr))) window.addEventListener('beforeunload', () => { const currentStateStr = JSON.stringify(this.$store.state) window.localStorage.setItem('app-state', currentStateStr) }) } }) // 如果需要更加精细控制哪些部分要保存的话则可以在 commit Mutation 的时候做判断处理。 ``` 这种方法虽然简单但是灵活性较差一些,并且需要注意的是直接监听全局事件可能会带来一定的风险因此建议优先选用成熟的方案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值