vuex刷新之后數(shù)據(jù)丟失,數(shù)據(jù)持久化,vuex-persistedstate問題
為什么刷新之后vuex的狀態(tài)就沒了?
原因是刷新之后js初始化,vuex重新初始化了;
常見的解決方案
1,mounted里面調(diào)接口重新給state賦值,太麻煩,pass
2,watch里面監(jiān)聽state,再賦值,也很low
完美方案是利用sessionStorage/localStorage
做一個(gè)暫時(shí)的儲(chǔ)存
store的模塊化結(jié)構(gòu)
主要是針對(duì)mutations和getters
做一個(gè)簡單的賦值和取值封裝
mutations.js改變state的同時(shí)在本地做一個(gè)備份
const setStorage = (key, value) => { if (typeof (value) === 'object') { value = JSON.stringify(value) } sessionStorage.setItem(key, value) } /* * 避免刷新之后vuex被重置,在sessionStorage做一個(gè)備份 */ 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 取值時(shí)默認(rèn)從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獲取狀態(tài)值
這樣一來就算state被清空了,還可以在本地儲(chǔ)存里面獲取狀態(tài)值
后記:
本來想寫一個(gè)插件完成上面的事,結(jié)果發(fā)現(xiàn)一個(gè)已經(jīng)寫好的 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) => { // 根據(jù)obj的類型判斷是新建一個(gè)數(shù)組還是一個(gè)對(duì)象 let newObj = obj instanceof Array ? [] : {}; for (let key in obj) { // 判斷屬性值的類型,如果是對(duì)象遞歸調(diào)用深拷貝 newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]; } return newObj; }
如何讓vuex數(shù)據(jù)持久化
為什么要讓vuex數(shù)據(jù)持久化
在使用vuex的時(shí)候,會(huì)發(fā)現(xiàn)刷新頁面之后state中存儲(chǔ)的數(shù)據(jù)會(huì)被重置,因?yàn)樗⑿聻g覽器的時(shí)候會(huì)導(dǎo)致整個(gè)頁面重新加載,vuex的state也會(huì)全部重新加載,所以為了防止這類情況的發(fā)生,我們會(huì)將vuex中的數(shù)據(jù)進(jìn)行本地存儲(chǔ),防止頁面刷新丟失vuex中的數(shù)據(jù)。
如何將vuex中的數(shù)據(jù)持久化
1.我們需要安裝一個(gè)插件,我們需要借助這個(gè)vuex-persistedstate插件進(jìn)行持久化
// 安裝依賴包 npm install vuex-persistedstate ?--save
2.使用vuex-persistedstate插件來進(jìn)行持久化
key
是存儲(chǔ)數(shù)據(jù)的鍵名(本地存儲(chǔ))paths
是state中那些需要被的數(shù)據(jù),如果是模塊下的數(shù)據(jù),則在前面加上模塊名稱plugins
要的是一個(gè)一維數(shù)組不然會(huì)解析錯(cuò)誤
import createPersistedState from 'vuex-persistedstate' ? const store = new Vuex.Store({ ? // ... ? plugins: [ ? ? createPersistedState({ ? ? key: 'stort', ? ? ?可以寫多個(gè) ? ? paths: ['userinfo', ......] ? ?? ?}) ? ] })
3.指定需要持久化的數(shù)據(jù)
import createPersistedState from "vuex-persistedstate" const store = new Vuex.Store({ ?// ... ?plugins: [createPersistedState({ ? storage: window.sessionStorage, ? reducer(val) { ? ?return { ? ?// 只儲(chǔ)存state中的assessmentData ? ?assessmentData: val.assessmentData ? } ? } ?})]
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue2.0 如何在hash模式下實(shí)現(xiàn)微信分享
這篇文章主要介紹了vue2.0 如何在hash模式下實(shí)現(xiàn)微信分享,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01Vue基于vuex、axios攔截器實(shí)現(xiàn)loading效果及axios的安裝配置
這篇文章主要介紹了Vue基于vuex、axios攔截器實(shí)現(xiàn)loading效果及axios的安裝配置,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04element-ui中el-row中設(shè)置:gutter間隔不生效問題
這篇文章主要介紹了element-ui中el-row中設(shè)置:gutter間隔不生效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08詳解關(guān)于Vue2.0路由開啟keep-alive時(shí)需要注意的地方
這篇文章主要介紹了關(guān)于Vue2.0路由開啟keep-alive時(shí)需要注意的地方,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09解決vue做詳情頁跳轉(zhuǎn)的時(shí)候使用created方法 數(shù)據(jù)不會(huì)更新問題
這篇文章主要介紹了解決vue做詳情頁跳轉(zhuǎn)的時(shí)候使用created方法 數(shù)據(jù)不會(huì)更新問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07vue2.0.js的多級(jí)聯(lián)動(dòng)選擇器實(shí)現(xiàn)方法
下面小編就為大家分享一篇vue2.0.js的多級(jí)聯(lián)動(dòng)選擇器實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02一文詳解如何創(chuàng)建Vue3項(xiàng)目及組合式API
Vue3提供了一種組合式API,可以用來構(gòu)建可復(fù)用的組件和應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于如何創(chuàng)建Vue3項(xiàng)目及組合式API的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05解決vue elementUI中table里數(shù)字、字母、中文混合排序問題
這篇文章主要介紹了vue elementUI中table里數(shù)字、字母、中文混合排序問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Vue3 axios配置以及cookie的使用方法實(shí)例演示
這篇文章主要介紹了Vue3 axios配置以及cookie的使用方法,需要的朋友可以參考下2023-02-02