vuex刷新之后数据丢失,数据持久化,vuex-persistedstate问题

 更新时间:2022年03月30日 10:53:48   作者:秋刀鱼笛滋味  
这篇文章主要介绍了vuex刷新之后数据丢失,数据持久化,vuex-persistedstate问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

为什么刷新之后vuex的状态就没了?

原因是刷新之后js初始化,vuex重新初始化了;

常见的解决方案

1,mounted里面调接口重新给state赋值,太麻烦,pass

2,watch里面监听state,再赋值,也很low

vuex理解不透彻的可以先看看 

完美方案是利用sessionStorage/localStorage

做一个暂时的储存

store的模块化结构

在这里插入图片描述

主要是针对mutations和getters

做一个简单的赋值和取值封装

mutations.js改变state的同时在本地做一个备份

const setStorage = (key, value) => {
  if (typeof (value) === 'object') {
    value = JSON.stringify(value)
  }
  sessionStorage.setItem(key, value)
}
/*
* 避免刷新之后vuex被重置,在sessionStorage做一个备份
 */
const mutations = {
  set_userInfo (state, payload) {
    state.userInfo = payload
    setStorage('userInfo', payload)
  },
  set_token (state, payload) {
    state.token = payload
    setStorage('token', payload)
  },
  set_roles (state, payload) {
    state.roles = payload
    setStorage('roles', payload)
  },
  set_breadcrumb (state, payload) {
    state.breadcrumb = payload
    setStorage('breadcrumb', payload)/*  */
  }
}
export default mutations

getters.js 取值时默认从state里面取,没有就从本地拿

import createdRoutes from '@/utils/createdRoutes.js'
import { asyncRoutes } from '@/router/index.js'
let getStoryage = (item) => {
  let str = sessionStorage.getItem(item)
  return JSON.parse(str)
}
const getters = {
  get_userInfo: (state) => {
    return state.userInfo ? state.userInfo : getStoryage('userInfo')
  },
  get_token: (state) => {
    return state.token ? state.token : sessionStorage.getItem('token')
  },
 get_roles: (state) => {
    return state.roles.length ? state.roles : getStoryage('roles')
  },
  addRouters: (state, getters) => {
    let routes = createdRoutes(asyncRoutes, getters.get_roles)
    return routes
  },
  get_breadcrumb: (state, getters) => {
    return state.breadcrumb.length ? state.breadcrumb : getStoryage('getStoryage')
  }
}
export default getters;

在页面vue文件直接用mapGetters获取状态值

这样一来就算state被清空了,还可以在本地储存里面获取状态值

后记:

本来想写一个插件完成上面的事,结果发现一个已经写好的 vuex-persistedstate

用法:

import state from './state.js'
import getters from './getters.js'
import mutations from './mutations.js'
import actions from './actions.js'
import Vuex from 'vuex'
import Vue from 'vue'
import { deepCopy } from '@/utils/util'
import createPersistedState from "vuex-persistedstate"
Vue.use(Vuex)
let store = new Vuex.Store({
  strict: process.env.NODE_ENV !== 'production',
  state,
  getters,
  mutations,
  actions,
  plugins: [createPersistedState({
    storage: window.sessionStorage,
    reducer (state) {
      let _state = deepCopy(state) // 深拷贝一份 删除不想保存的
      delete _state.hasLogin
      delete _state.ziYuanLaiYuan
      delete _state.orderStatus
      delete _state.taxPersonType
      return _state
    }
  })]
})
export default store

深拷贝

```bash
/**
 * 深拷贝
 * @param {Array,Object} obj
 */
export const deepCopy = (obj) => {
  // 根据obj的类型判断是新建一个数组还是一个对象
  let newObj = obj instanceof Array ? [] : {};
  for (let key in obj) {
    // 判断属性值的类型,如果是对象递归调用深拷贝
    newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
  }
  return newObj;
}

如何让vuex数据持久化

为什么要让vuex数据持久化

在使用vuex的时候,会发现刷新页面之后state中存储的数据会被重置,因为刷新浏览器的时候会导致整个页面重新加载,vuex的state也会全部重新加载,所以为了防止这类情况的发生,我们会将vuex中的数据进行本地存储,防止页面刷新丢失vuex中的数据。

如何将vuex中的数据持久化

1.我们需要安装一个插件,我们需要借助这个vuex-persistedstate插件进行持久化

// 安装依赖包
npm install vuex-persistedstate  --save

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

  • key是存储数据的键名(本地存储)
  • paths是state中那些需要被的数据,如果是模块下的数据,则在前面加上模块名称
  • plugins要的是一个一维数组不然会解析错误
import createPersistedState from 'vuex-persistedstate'
 
const store = new Vuex.Store({
  // ...
  plugins: [
    createPersistedState({
    key: 'stort',
     可以写多个
    paths: ['userinfo', ......]
      })
  ]
})

3.指定需要持久化的数据

import createPersistedState from "vuex-persistedstate"
const store = new Vuex.Store({
 // ...
 plugins: [createPersistedState({
  storage: window.sessionStorage,
  reducer(val) {
   return {
   // 只储存state中的assessmentData
   assessmentData: val.assessmentData
  }
  }
 })]

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)

    Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)

    组件(Component)是 Vue.js 最强大的功能之一。接下来给大家介绍vuejs单向绑定、双向绑定、列表渲染、响应函数的相关知识,非常不错,感兴趣的朋友一起看看吧
    2016-09-09
  • Vue组件层级关系详细分析

    Vue组件层级关系详细分析

    这篇文章主要介绍了Vue组件的层级关系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • vue中vite.config.js配置跨域以及环境配置方式

    vue中vite.config.js配置跨域以及环境配置方式

    这篇文章主要介绍了vue中vite.config.js配置跨域以及环境配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 解决ant design vue 表格a-table二次封装,slots渲染的问题

    解决ant design vue 表格a-table二次封装,slots渲染的问题

    这篇文章主要介绍了解决ant design vue 表格a-table二次封装,slots渲染的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • vue项目中路由懒加载的三种方式(简洁易懂)

    vue项目中路由懒加载的三种方式(简洁易懂)

    本文主要介绍了vue项目中路由懒加载的三种方式,主要包括vue异步组件,组件懒加载,webpack的require.ensure(),具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Vue router应用问题实战记录

    Vue router应用问题实战记录

    vue-router是vue.js官方的路由插件,他和vue.js是深度集成的适合构建单页面应用,下面这篇文章主要给大家介绍了关于Vue router应用问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Vant中Popover气泡弹出框位置错乱问题解决

    Vant中Popover气泡弹出框位置错乱问题解决

    这篇文章主要为大家介绍了Vant中Popover气泡弹出框位置错乱问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • vue--点击当前增加class,其他删除class的方法

    vue--点击当前增加class,其他删除class的方法

    今天小编就为大家分享一篇vue--点击当前增加class,其他删除class的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue3新增Teleport的问题

    vue3新增Teleport的问题

    这篇文章主要介绍了vue3新增Teleport的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue.js实现三级菜单效果

    vue.js实现三级菜单效果

    这篇文章主要为大家详细介绍了vue.js实现三级菜单效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10

最新评论