使用 vuex-persistedstate 維持 Vuex 狀態

Carey Sung
4 min readSep 19, 2020

--

在使用 vue 時,我們常會利用 vuex 來集中管理組件的狀態,例如使用者授權狀態或是購物車內容,但是缺點就是當我們重新整理頁面,存在 state 中的狀態就會被清空。為了讓使用者刷新頁面不用重新登入,我們就需要在刷新畫面後重新拿回資料。

Vuex 取得狀態並且和各組件共享狀態

方法一 :透過 API 重新向後端請求使用者資料

  1. 將 token 存入 localStorage
  2. 在路由改變時透過 beforeRouteUpdate 來重新向伺服器發送 token
router.beforeEach((to, from, next) => {
const token = localStorage.getItem('token')
const stateToken = store.state.token
if (token !== stateToken) {
store.dispatch('fetchUser') //向後端請求使用者資料的 action
}
next()
})

方法二:使用 vuex-persistedstate 套件將狀態存入 localStorage

npm 安裝

$ npm install --save vuex-persistedstate

store 中引入

import createPersistedState from "vuex-persistedstate"const store = new Vuex.Store({
state: {
user: '',
isAuthenticated: '',
token: '',
//...
},
plugins: [createPersistedState()] //加入
})

這樣可以將整包 state 狀態保存在 localStorage 中,下次重新整理頁面時vuex-persistedstate 會自動幫我們將狀態回復。也可以設置保存在 sessionStore中:

plugins: [createPersistedState({       
storage: window.sessionStorage
})]

如果只想保存部分資料可以使用參數 reducer

plugins: [createPersistedState({       
reducer(val) {
return {
user: val.user //只儲存使用者資料
}
}
})]

secure-ls 加密 localStorage

不過訊息這樣赤裸裸地放在那裡好像不太好,如果想加密 localStorage 中的資料可以使用 secure-ls

$ npm install secure-ls

在 store 中引入套件

import SecureLS from "secure-ls"
const ls = new SecureLS({ isCompression: false })
const store = new Vuex.Store({
state: {
//...
},
plugins: [
createPersistedState({
key: 'userInfo', //儲存在 localStorage 的 key
storage: {
getItem: key => ls.get(key),
setItem: (key, value) => ls.set(key, value),
removeItem: key => ls.remove(key)
}
})
將 localStorage 內容加密

透過 vuex-persistedstate 更有效率的保存 state,比起重新向後端請求使用者資料常常會有一小段的等待時間,這樣就不會造成已經進入網站過了幾秒才突然顯示使用者資料。

更詳細文件內容
vuex-persistedstate
secure-ls

--

--