数据状态持久化插件 vuex-persistedstate 的使用

在 Vue.js 应用中,使用 Vuex 状态管理库时,页面刷新会导致 Vuex 中的状态丢失,因为 Vuex 的状态是存储在内存中的。为了在页面刷新后仍然保留这些状态,你可以采用以下几种策略来持久化 Vuex 的状态:

  1. 使用 Local StorageSession Storage

    • 可以在页面加载时从 Local StorageSession Storage 中读取状态,并将其恢复到 Vuex store 中。
    • 页面刷新前,可以将 Vuex 的状态保存到 Local StorageSession Storage 中。
  2. 重新请求接口从后端获取

    • 在路由守卫 beforeEach() 中发送请求, 再次将数据存储到 vuex store 中
  3. 使用 Vuex 插件

    • 有一些现成的插件可以帮助你更容易地实现状态持久化,例如 vuex-persistedstate

使用 Local StorageSession Storage

// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    userMsg: null,
  },
  mutations: {
    setUserMsg(state, payload) {
      state.userMsg = payload;
      localStorage.setItem('userMsg', JSON.stringify(payload));
    },
  },
});

封装 beforeEach() 函数重新请求接口获取

// src/permission.js
import store from '@/store';
import { getUserInfo, } from '@/api/user';
const whiteList = ['/login', '/404']

router.beforeEach((to, from, next) => {
  if (store.getters.token) { // determine if there has token
    /* has token*/
    if (to.path === '/login') {
      next({ path: '/' });
    } else {
      if (store.getters.roles.length === 0) {
        // 调用接口获取数据
        getUserInfo().then(({ data }) => {
          console.log('data::: ', data);
          store.commit('SET_ROLES', data.roles);
          store.commit('SET_ROLES_TYPE', data.roleType);
          store.commit('SET_USERIFNO', data.sysUser);
          console.log('store.user', store.state);
          next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
        })
      } else {
        next();
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next('/login')
    }
  }
})

使用 Vuex 插件

vuex-persistedstate 是一个用于将 Vuex store 中的状态持久化的插件。它可以将状态存储在浏览器的 Local Storage、Session Storage 或 Cookie 中,并在页面重新加载时恢复这些状态。

安装 vuex-persistedstate :

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

配置 vuex-persistedstate

// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate';

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    userMsg: null,
  },
  mutations: {
    setUserMsg(state, payload) {
      state.userMsg = payload;
    },
  },
});

// 使用插件
store.plugin(createPersistedState({
  paths: ['userMsg'],
}));

export default store;

参数选项
createPersistedState 接受一个对象作为参数,其中包含以下可选配置项:

  • key: 存储数据时使用的键名,默认为 ‘vuex’。
  • storage: 存储数据的位置,默认为 window.localStorage。也可以设置为 window.sessionStorage 或自定义存储方法。
  • paths: 指定需要持久化的 state 属性路径数组,默认为 undefined,表示持久化整个 state
  • reducer: 类似于 Redux 的 reducer 函数,用于决定哪些状态应该被持久化,默认为 undefined
  • transformer: 在存储数据前进行转换的函数,默认为 undefined
  • filter: 用于过滤状态的函数,默认为 undefined
  • purgeOnEachLoad: 是否在每次加载时清除存储的数据,默认为 false
  • merge: 是否合并状态而不是替换,默认为 false
  • silent: 是否禁用日志输出,默认为 false
  • strictMode: 是否启用严格模式,默认为 false。在严格模式下,如果持久化失败则抛出错误。

示例

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

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    count: 0,
    user: null,
    settings: { theme: 'light' },
  },
  mutations: {
    increment(state) {
      state.count++;
    },
    setUser(state, user) {
      state.user = user;
    },
    setTheme(state, theme) {
      state.settings.theme = theme;
    },
  },
});

// 使用插件
store.plugin(createPersistedState({
  key: 'my-app',
  storage: window.localStorage,
  paths: ['count', 'user', 'settings.theme'], // 仅持久化这些路径
}));

export default store;

注意事项: 如果使用 vuex-persistedstate,记得在生产环境中配置合适的 options,例如加密或选择合适的存储方式(Local Storage vs Session Storage)。

Vuex持久化插件vuex-persistedstate是一个用于在Vue.js应用中实现Vuex状态持久化插件。它可以将Vuex中的某些状态保存在本地存储中,以便在页面刷新或重新加载后,仍然可以保持这些状态的值。 在使用vuex-persistedstate插件时,我们首先需要通过npm安装它,可以使用以下命令进行安装: npm install vuex-persistedstate --save 接下来,在我们的Vue应用中,我们需要在Vuex的store文件中引入vuex-persistedstate插件,并将其添加到Vuex的plugins选项中。以一个具体的例子来说明,如果我们想要给tab模块的state中的menu做持久化,我们可以使用如下代码配置我们的store: import Vue from 'vue' import Vuex from 'vuex' import tab from './tab.js' import createPersistedState from "vuex-persistedstate" Vue.use(Vuex) export default new Vuex.Store({ modules: { tab }, plugins: [ createPersistedState({ paths: ['tab.menu'] }) ] }) 在上述代码中,我们引入了createPersistedState方法并将其作为插件传递给Vuex的plugins选项。通过传递一个对象给createPersistedState方法的paths选项,我们可以指定需要持久化状态的路径。在这个例子中,我们指定了tab模块下的menu状态需要进行持久化。 这样,当我们在应用中对tab模块的menu状态进行修改后,这个修改将会被自动保存在本地存储中。当我们刷新或重新加载页面时,这个状态的值将会被还原,以便我们可以继续使用之前保存的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [vuex持久化存储插件vuex-persistedstate](https://blog.csdn.net/weixin_51382988/article/details/128584817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值