vuex數(shù)據(jù)狀態(tài)持久化問題
在VUE項(xiàng)目中,由于是單頁應(yīng)用,vuex中的數(shù)據(jù)在頁面刷新時(shí)就會(huì)被清除,所以我們要考慮怎樣讓vuex中的數(shù)據(jù)持久保存在瀏覽器中,至少不能每次刷新時(shí)都丟失登錄狀態(tài)。
本文介紹VUE項(xiàng)目中常用到的兩種vuex持久化的方法,底層實(shí)現(xiàn)原理一直,方法不太一樣,可以在項(xiàng)目中根據(jù)實(shí)際來區(qū)分
方法一、瀏覽器監(jiān)聽+本地存儲(chǔ)
我們可以監(jiān)聽瀏覽器的刷新,在頁面刷新時(shí)將vuex內(nèi)的數(shù)據(jù)保存在本地存儲(chǔ)中(根據(jù)項(xiàng)目需要可以考慮保存在sessionStorage或者localStorage中)
在App.vue中,created生命周期寫我們的監(jiān)聽方法
window.addEventListener("beforeunload", () => { sessionStorage.setItem("store", JSON.stringify(this.$store.state)) })
然后在進(jìn)入到created生命周期時(shí),去到sessionStorage/localStorage中的數(shù)據(jù),將數(shù)據(jù)替換到vuex中
if(sessionStorage.getItem("store")) { this.$store.replaceState(Object.assign({}, this.$store.state, JSON.parse(sessionStorage.getItem('store')))) }
整體來說明一下代碼
created() { // 頁面加載時(shí),讀取sessionStorage中的狀態(tài)信息 if(sessionStorage.getItem("store")) { this.$store.replaceState(Object.assign({}, this.$store.state, JSON.parse(sessionStorage.getItem('store')))) } // 在頁面刷新時(shí),將vuex中的信息保存到sessionStorage里 window.addEventListener("beforeunload", () => { sessionStorage.setItem("store", JSON.stringify(this.$store.state)) }) },
這個(gè)方法的好處是不需要借助其他三方組件庫,實(shí)現(xiàn)vuex全量數(shù)據(jù)持久化,壞處是所有數(shù)據(jù)保存在本地,會(huì)有一些較敏感數(shù)據(jù)容易被查看到,另外如果做某些指定數(shù)據(jù)持久化時(shí)會(huì)比較麻煩,所以下面介紹第二種更為簡單的方法
方法二、狀態(tài)持久化插件
推薦使用 vuex-persistedstate 插件
使用方法
如下:
1、在項(xiàng)目中安裝該插件
cnpm i --save vuex-persistedstate
2、在 src/store/index.js中引入該插件
import createPersistedState from 'vuex-persistedstate'
在vuex中使用
plugins: [createPersistedState()]
整體代碼
如下:
import Vue from 'vue' import Vuex from 'vuex' import createPersistedState from 'vuex-persistedstate' Vue.use(Vuex) export default new Vuex.Store({ plugins: [createPersistedState({ storage: window.sessionStorage, // 默認(rèn)位置是 localStorage reducer: (state) => { return { // 默認(rèn)是全部緩存,在這里可以設(shè)置需要緩存的狀態(tài) token: state.token } } })], state: { token: '' }, mutations: { }, }
優(yōu)點(diǎn):
1、可以更便捷設(shè)置存儲(chǔ)位置 為sessionStorage或者 localStorage中,默認(rèn)為 localStorage
2、可以更便捷設(shè)置需要存儲(chǔ)的內(nèi)容,如當(dāng)需要存儲(chǔ)token時(shí),只需要將token放入進(jìn)入即可
總結(jié)
本文插件只簡單概述了一下狀態(tài)持久化插件的用法,還有更多用法并未用到,在此并未講述,有興趣的朋友可以此插件github地址做更多了解(當(dāng)然還有很多其他很好用的插件和方法,本文只提到了我自己項(xiàng)目中使用過的)
好了,以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue的watch和computed方法的使用及區(qū)別介紹
Vue的watch屬性可以用來監(jiān)聽data屬性中數(shù)據(jù)的變化。這篇文章主要介紹了Vue的watch和computed方法的使用及區(qū)別,需要的朋友可以參考下2018-09-09從零開始Vue3數(shù)據(jù)交互之promise用法詳解
這篇文章主要介紹了Axios的基本使用,包括異步編程的基礎(chǔ)知識,如Promise的介紹、特點(diǎn)和基本用法,以及如何使用then、catch和async/await來處理異步操作,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02vue項(xiàng)目啟動(dòng)時(shí)無法識別es6的擴(kuò)展語法的解決
啟動(dòng)項(xiàng)目時(shí)遇到ES6的拓展運(yùn)算符報(bào)錯(cuò)可以通過切換到淘寶鏡像,以及在項(xiàng)目根目錄下新增.babelrc和postcss.config.js文件來解決,這些操作有助于正確配置項(xiàng)目環(huán)境,從而避免報(bào)錯(cuò),并保證項(xiàng)目的順利運(yùn)行,希望這些經(jīng)驗(yàn)?zāi)軌驇椭接龅较嗤瑔栴}的開發(fā)者2024-10-10vue中js實(shí)現(xiàn)點(diǎn)擊復(fù)制文本到剪貼板的3種方案
今天遇到一個(gè)復(fù)制粘貼的需求,研究之后發(fā)現(xiàn)太簡單了,這篇文章主要給大家介紹了關(guān)于vue中js實(shí)現(xiàn)點(diǎn)擊復(fù)制文本到剪貼板的3種方案,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09Vue 動(dòng)態(tài)添加路由及生成菜單的方法示例
這篇文章主要介紹了Vue 動(dòng)態(tài)添加路由及生成菜單的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06