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

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

大家都知道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]  //插件实例的配置
})

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

猜你喜欢

转载自blog.csdn.net/THcoding_Cat/article/details/109914232