vuex 联动 sessionStorage 对数据持续存储

vuex 联动 sessionStorage 对数据进行持续存储,防止用户手动刷新页面导致vuex数据丢失,页面出错问题

1. 该方法利用vuex的plugins属性实现,直接放代码,( sessionStorage.setItem 可以把数据加密下,取值的时候也需要解密)

  • 封装存储和获取存储的方法,这里用到JSON.stringify和JSON.parse是为了保证存储和获取时的数据类型都一致
  • 比如直接存数字0得到的就是数字0,存false时获取到的也是布尔类型的false,也可以存对象或者数据
  • 不能存储 undefined ,因为JSON.parse会报错
  • 也可以在封装方法中进行存储加密等操作
// 封装存储和获取存储的方法,这里用到JSON.stringify和JSON.parse是为了保证存储和获取时的数据类型都一致
// 比如直接存数字0得到的就是数字0,存false时获取到的也是布尔类型的false,也可以存对象或者数据
// 不能存储 undefined ,因为JSON.parse会报错
// 也可以在封装方法中进行存储加密等操作
const setItem = (key, value) => {
  sessionStorage.setItem(key, value !== undefined ? JSON.stringify(value) : '')
}
const getItem = (key) => {
  try {
    return JSON.parse(sessionStorage.getItem(key))
  } catch (error) {
    return undefined
  }
}
const sessionStoragePlugin = store => {
  // 自动化恢复local中的数据到store
  const localState = JSON.parse(JSON.stringify(store.state))
  Object.keys(store.state).forEach(key => {
    let localData = getItem(key)
    if (localData !== undefined) { // 如果本地存在缓存则恢复数据,如果没有则用state里面定义的默认值
      localState[key] = localData
    }
  })
  store.replaceState(localState)

  // 自动同步vuex中的数据到local
  store.subscribe((mutation, state) => {
    Object.keys(state).forEach((stateName, index) => {
      setItem(stateName, state[stateName])
    })
  })
}
export default sessionStoragePlugin

 

 

2. 将上面暴露出去的东西放在vuex 的plugin 里面就好了

 1 import Vue from 'vue'
 2 
 3 import Vuex from 'vuex'
 4 
 5 import sessionStoragePlugin from './sessionStoragePlugin'
 6 
 7 import vuexdata from './vuexdata.js'
 8 
 9 Vue.use(Vuex)
10 
11 export default new Vuex.Store({
12   modules: {
13     vuexdata,
14   },
15   // strict: process.env.NODE_ENV !== 'production',
16   plugins: [sessionStoragePlugin]
17 })

 

 

 以上

posted @ 2019-12-03 12:09  blackbentel  阅读(1187)  评论(0编辑  收藏  举报