美文网首页
vuex实现数据持久化的两种方案

vuex实现数据持久化的两种方案

作者: 扶得一人醉如苏沐晨 | 来源:发表于2023-10-08 12:04 被阅读0次

为什么需要数据持久化

vuex的state数据刷新页面的时候数据都会被清空,在某些情况下,我们需要这些状态能保存下来,比如登录后的用户信息、Token、主题配置等。

vuex优势:相比sessionStorage,存储数据更安全,sessionStorage可以在控制台被看到。

vuex劣势:在F5刷新页面后,vuex会重新更新state,所以,存储的数据会丢失。

持久化原理:结合本地存储做到数据状态持久化,使页面刷新后数据不会初始化为默认状态。

方案一:封装 storage 存储模块,利用本地存储

方案二:安装一个vuex的插件 vuex-persistedstate

一、方案一:利用本地存储进行 vuex 持久化处理

1.1、封装store.js代码如下

/**
 * 判断是否为空
 */
function validatenull(val) {
  if (typeof val === "boolean") {
    return false;
  }
  if (typeof val === "number") {
    return false;
  }
  if (val instanceof Array) {
    if (val.length === 0) return true;
  } else if (val instanceof Object) {
    if (JSON.stringify(val) === "{}") return true;
  } else {
    if (
      val === "null" ||
      val == null ||
      val === "undefined" ||
      val === undefined ||
      val === ""
    )
      return true;
    return false;
  }
  return false;
}
/* 定义存储的keyName */
const keyName = "xxxx" + "-";
/**
 * type如果有值就是sessionStorage存储,不传就是localStorage存储
 */
export const setStore = (params = {}) => {
  let { name, content, type } = params;
  name = keyName + name;
  const obj = {
    dataType: typeof content,
    content: content,
    type: type,
    datetime: new Date().getTime(),
  };

  if (type) {
    window.sessionStorage.setItem(name, JSON.stringify(obj));
  } else {
    window.localStorage.setItem(name, JSON.stringify(obj));
  }
};
/**
 * 获取存储的值
 */

export const getStore = (params = {}) => {
  let { name } = params;
  name = keyName + name;
  let obj = {};
  let content;
  obj = window.sessionStorage.getItem(name);
  if (validatenull(obj)) obj = window.localStorage.getItem(name);
  if (validatenull(obj)) return;
  try {
    obj = JSON.parse(obj);
  } catch (e) {
    return obj;
  }
  if (obj.dataType === "string") {
    content = obj.content;
  } else if (obj.dataType === "number") {
    content = Number(obj.content);
  } else if (obj.dataType === "boolean") {
    content = eval(obj.content);
  } else if (obj.dataType === "object") {
    content = obj.content;
  }
  return content;
};
/**
 * 删除缓存 type有值清除sessionStorage缓存,没有值清除localStorage缓存
 */
export const removeStore = (params = {}) => {
  let { name, type } = params;
  name = keyName + name;
  if (type) {
    window.sessionStorage.removeItem(name);
  } else {
    window.localStorage.removeItem(name);
  }
};

1.2、vuex中使用

import { getStore, setStore } from "@/util/store";
const user = {
  state: {
    userInfo:
      getStore({
        name: "userInfo",
      }) || {},
    token:
      getStore({
        name: "token",
      }) || "",
  },
  mutations: {
    SET_USER_INFO: (state, userInfo) => {
      state.userInfo = userInfo;
      setStore({
        name: "userInfo",
        content: userInfo,
        type: "session",
      });
    },
    SET_TOKEN: (state, token) => {
      state.token = token;
      setStore({
        name: "token",
        content: state.token,
        type: "session",
      });
    },
  },
};
export default user;

二、方案二:利用插件vuex-persistedstate

2.1、安装插件 vuex-persistedstate

npm install vuex-persistedstate --save

2.2、vuex-persistedstate默认存储到localStorage

import createPersistedState from 'vuex-persistedstate';
 
Vue.use(Vuex);
export default new Vuex.store({
    //...
    plugins:[createPersistedState] // 注意
})

2.3、使用vuex-persistedstate自定义存储方式

2.3.1、存储到sessionStorage

import createPersistedState from 'vuex-persistedstate';
 
Vue.use(Vuex);
export default new Vuex.store({
    //...
    plugins:[
        createPersistedState({
            storage:window.sessionStorage // 注意
        })
    ]
})

2、存储到cookie

import createPersistedState from 'vuex-persistedstate'
import * as Cookies from 'js-cookie'
 
export default new Vuex.Store({
  // ...
  plugins: [
    createPersistedState({ // 注意
      storage: {
        getItem: key => Cookies.get(key),
        setItem: (key, value) => Cookies.set(key, value, { expires: 7 }),
        removeItem: key => Cookies.remove(key)
      }
    })
  ]
})

2.4、部分数据持久化

2.4.1、vuex-persistedstate提供有一个reducer函数,可以自定义存储Key

// 实现持久化部分数据,被持久化的数据为:manage模块的isVisitor、login模块的time

import createPersistedState from 'vuex-persistedstate';
 
Vue.use(Vuex);
export default new Vuex.store({
    modules:{
        manage,
        login,
        userInfo,
        //...
    },
    strict:debug,
    plugins:[
        createPersistedState({
            reducer(val){ // 注意: 指定需要持久化的数据
                return {
                    isVisitor:val.manage.isVisitor,
                    time:val.login.time
                }
            }
        })
    ]
})

2.4.2 使用paths参数【推荐:使用更为简单】

// 实现持久化部分数据,被持久化的数据为:manage模块的isAdmin、login模块的token
 
import createPersistedState from 'vuex-persistedstate';
 
Vue.use(Vuex);
const PERSIST_PATHS = ['manage.isAdmin','login.token']; // 注意
export default new Vuex.store({
    modules:{
        manage,
        login,
        userInfo,
        //...
    },
    strict:debug,
    plugins:[
        createPersistedState({
            paths:PERSIST_PATHS // 注意
        })
    ]
})

相关文章

  • Redis 数据持久化

    Redis 中除了可以将数据保存在内存中,还支持两种数据持久化方案:RDB、AOF,实现将内存中的数据持久化到磁盘...

  • vue项目笔记

    打包后css、js和img路径错误 利用vuex-persistedstate插件实现vuex的数据持久化 Vue...

  • VueJs对比ReactJs

    VueJs的用法: 状态管理 Vuex实现状态管理,针对数据的持久化存储的需求可以使用vuex-persisted...

  • iOS 数据持久化方案-Realm的使用

    iOS 数据持久化方案-Realm的使用 iOS 数据持久化方案-Realm的使用

  • Vuex数据状态持久化:vuex-persistedstate、

    vuex-persistedstate 安装 使用 需要持久化的数据 vuex-persist 它就是为 Vuex...

  • redis

    redis的持久化 在redis中已经提供了两种持久化的方案 RDB: redis提供的一种基于快照机制实现的持久...

  • Redis的持久化方案

    首先redis有两种持久化方案:RDB和AOF: 一、RDB RDB持久化配置 Redis会将数据集的快照dump...

  • vuex用法

    vuex vuex解决不同组件的数据共享,数据持久化。 1.安装: npm install v...

  • redis持久化方案

    redis持久化两种方案 1. RDB; 间隔一段时间进行持久化,如果发生故障,数据会丢失, 进行持久化时,会fo...

  • Docker学习(13) 卷与持久化数据

    Docker学习(13) 卷与持久化数据 卷与持久化数据——简介 数据主要分为两种:持久化和非持久化。 持久化:就...

网友评论

      本文标题:vuex实现数据持久化的两种方案

      本文链接:https://www.haomeiwen.com/subject/xecbbdtx.html