【vue && vuex】vuex中的数据同步到localStorage和sessionStorage

本文介绍如何使用 vuex-persistedstate 插件解决 Vuex 数据在页面刷新时丢失的问题。并通过实例演示如何将不同数据分别存储在 localStorage 和 sessionStorage 中,以适应不同的应用场景。

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

懒,所以我使用插件。可是,要面对的就是对插件的一知半解。

大家都知道vuex中存储的数据在刷新地址栏时,会被销毁,故而vuex不能一直保持状态的存储。

其实手写代码去改造这一点是最好的,但我选择插件。使用的是vuex-persistedstate。

1.安装插件

npm i vuex-persistedstate

 

 2.默认使用

该插件默认将数据存储到localStorage中。

在store/index.js中使用:

import createPersistedState from "vuex-persistedstate";


const store = new Vuex.Store({
  // ...
  plugins: [createPersistedState()]
})

 但有些项目并不满足于将数据存储在localStorage中。希望将一部分数据存储到localStorage,一部分数据存储到sessionStorage中(真能为难人)。

举例:比如用户登录方面有个记住密码的功能,很多时候前端的实现都是通过将token存储在cookie中,将用户的userId存储在vuex(localStorage)中。

正是因为用户在记住密码的情况下,并没有所谓的真正的“记住密码”,所以记住密码不是一种真的登录,于是userId不能从后台获取,但又要在“记住密码”的状态

下进入系统,拿到用户的权限和信息,所以放到localStorage中更合适。但其他的数据放到sessionStorage更为保险,恩。。。(前端的安全机制。。。就。。我觉得又扯又多余)

 

3.将数据分开存储到localStorage和sessionStorage

 以我当前逻辑,有一个问题,就是userId和userInfo是在一个数据结构中的,他们应该是属于user.js这个模块的,是同一个state中。但是这里我尝试过在同一个state中将userInfo的userId单独存在localStorage中,userInfo剩余数据存在sessionStorage中。不清楚是怎么回事,页面全部关闭,localStorage中的userId会被清除掉。所以这里我将userId单独存一份state,并将这个小模块存在localStorage中才得以实现。 

//reducer方法拿到的vuexState是哪怕是分模块后的state的所有的状态
// 创建插件实例 这里单独存储userId,并且使用delete删除
//我在这里面直接使用点语法来返回,并没有起到作用
const localPersisted = createPersistedState({
  key: 'userId',
  storage: window.localStorage,
  reducer: (vuexState) => {
    let localState = Object.assign({}, vuexState);
    for (let key in localState) {
        if (key !== 'userId') {
          delete localState[key];
        }
    }
    return localState;
  }
});

//sessionLoStorage存储所有的数据(除了单独的userId的模块)
const sessionPersisted = createPersistedState({
  storage: window.sessionStorage,
  reducer: (vuexState) => {
    let sessionState = Object.assign({}, vuexState);
    for (let key in sessionState) {
      if (key === 'userId') {
        delete sessionState[key];
      }
    }
    return sessionState;
  }
});


export default new Vuex.Store({
  ...,
  plugins: [localPersisted,sessionPersisted]  //插件实例的配置
})

 

 该博客基于掘金的一篇博客,地址忘了,这两天补上。

 

 

可以在Vue3中使用Vuex插件来管理sessionStoragelocalStorage。下面是一个简单的示例: 1. 安装vuex插件:`npm install vuex` 2. 在store目录下创建一个新的文件`storage.js`,并添加以下代码: ```javascript const storage = { setSession(key, value) { sessionStorage.setItem(key, JSON.stringify(value)); }, getSession(key) { return JSON.parse(sessionStorage.getItem(key)); }, setLocal(key, value) { localStorage.setItem(key, JSON.stringify(value)); }, getLocal(key) { return JSON.parse(localStorage.getItem(key)); } }; export default storage; ``` 3. 在store目录下创建一个新的文件`index.js`,并添加以下代码: ```javascript import { createStore } from 'vuex'; import storage from './storage'; const store = createStore({ state: { sessionData: storage.getSession('sessionData') || {}, localData: storage.getLocal('localData') || {} }, mutations: { updateSessionData(state, data) { state.sessionData = data; storage.setSession('sessionData', data); }, updateLocalData(state, data) { state.localData = data; storage.setLocal('localData', data); } } }); export default store; ``` 4. 在Vue组件中使用Vuex,例如: ```javascript <template> <div> <h2>Session Data</h2> <p>{{ sessionData }}</p> <button @click="updateSessionData">Update Session Data</button> <h2>Local Data</h2> <p>{{ localData }}</p> <button @click="updateLocalData">Update Local Data</button> </div> </template> <script> import { mapState, mapMutations } from 'vuex'; export default { computed: { ...mapState(['sessionData', 'localData']) }, methods: { ...mapMutations(['updateSessionData', 'updateLocalData']), updateSessionData() { this.updateSessionData({ test: 'Session Data Updated' }); }, updateLocalData() { this.updateLocalData({ test: 'Local Data Updated' }); } } }; </script> ``` 在上面的示例中,我们使用`mapState``mapMutations`来将statemutations映射到组件中,然后使用`sessionData``localData`来获取当前在store中的数据。当我们更新数据时,我们调用`updateSessionData`或`updateLocalData`方法,这会触发相应的mutations并更新store中的数据。mutations中的更新数据也会同步sessionStoragelocalStorage中。 这是一个简单的示例,你可以根据自己的需求进行修改。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值