Nuxt引入vue-persistedstate以及踩坑記錄
前言
項(xiàng)目需求,需要vuex進(jìn)行路由持久化保存,結(jié)合nuxt框架進(jìn)行記錄。
思路
監(jiān)聽(tīng)數(shù)據(jù)變化, 每當(dāng)?shù)卿浲戤?
vuex 數(shù)據(jù)發(fā)生變化,就要將數(shù)據(jù)保存到瀏覽器 本地 (指用戶瀏覽器localStorage)
頁(yè)面打開(kāi)時(shí), 會(huì)嘗試將之前保存過(guò)的數(shù)據(jù)恢復(fù)到 vuex 當(dāng)中即可
有點(diǎn)復(fù)雜, 找個(gè)插件幫忙
實(shí)現(xiàn)緩存信息到本地
nuxtjs中store不能直接使用瀏覽器的lcoalStorage方法,
而且自己寫(xiě)數(shù)據(jù)同步功能比較麻煩,
所以我們需要依賴(lài)一個(gè)插件vuex-persistedstate,該插件會(huì)把本地存儲(chǔ)的數(shù)據(jù)存儲(chǔ)到store。
引入方法
1.安裝
npm install vuex-persistedstate --save
nuxt.config.js配置文件
plugins: [
'@/plugins/element-ui',
// '@/plugins/localStorage'
// 這里的引入, 如果是普通字符串, 就在服務(wù)端馬上運(yùn)行
// 如果是要等到瀏覽器再運(yùn)行的代碼可以將配置改為對(duì)象, 并且 路徑作為 src 傳進(jìn)去
{
src: '@/plugins/localStorage',
// 如果只在瀏覽器加載的代碼, 可以添加一個(gè) 屬性 ssr: false
ssr: false
}
],plugins/localStorage.js
console.log('測(cè)試自定義插件')
// 在這個(gè)自定義插件中配置 vuex-persistedstate
import createPersistedState from 'vuex-persistedstate'
// 這里什么都可以寫(xiě), 不過(guò)如果你需要用到 nuxt 本身, 必須通過(guò) export 的方式暴露函數(shù)來(lái)接收
export default ({store}) => {
// 如果想要等到 nuxt 加載完畢
// 再執(zhí)行代碼, 有一個(gè)函數(shù)叫做 window.onNuxtReady()
window.onNuxtReady(()=>{
createPersistedState({
// 在這里其實(shí), 是想要將 vuex 數(shù)據(jù)存放到 localStorage 里面
key: 'store'
})(store)
})
}2.使用
store/index.js
// 用戶管理
export const state = () => ({
//采用接口返回的數(shù)據(jù)結(jié)構(gòu)
userInfo: {
// token: '',
// user: {}
}
})
// 測(cè)試
// export const state = () => {
// return {
// // 這里是全局狀態(tài)數(shù)據(jù)保存的地方
// abc: 123
// }
// }
// 修改 state 里面的數(shù)據(jù), 必須使用 mutations 里面的函數(shù)
export const mutations = {
// 每個(gè)屬性都是一個(gè)函數(shù), 作為修改 state 的方法
// setAbc(state, data) {
// 每個(gè) mutation 函數(shù)都可以接受到兩個(gè)參數(shù)
// 第一個(gè)是 state 對(duì)象本身
// 第二是調(diào)用函數(shù)時(shí)額外添加的數(shù)據(jù)
// 這里需要做的就是改變 state 數(shù)據(jù)
// state.abc = data
// 這樣外面調(diào)用這個(gè)函數(shù), 并且傳入數(shù)據(jù), 即可改變當(dāng)前的 abc 屬性
setUserInfo(state, data) {
state.userInfo = data
}
};項(xiàng)目中需要存儲(chǔ)的地方:
//將結(jié)果發(fā)送到剛剛新建的vuex中,存儲(chǔ),實(shí)現(xiàn)狀態(tài)持久化,不然刷新之后數(shù)據(jù)就沒(méi)了
this.$store.commit('userstore/setUserInfo',res.data)項(xiàng)目中需要使用的地方:
computed:{
userInfo(){
return this.$store.state.userstore.userInfo
}
},
----------渲染頭像-----------------
<el-dropdown v-if="userInfo.token">
<img :src="baseURL+userInfo.user.defaultAvatar"/>
{{userInfo.user.nickname}}修改完后重新啟動(dòng)項(xiàng)目即可。
3.踩坑
引入后可能出現(xiàn)window is not defined 問(wèn)題:
- 檢查nuxt.config.js中是否將ssr置為false
- 將nuxt.config.js中mode設(shè)置為’spa’
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue項(xiàng)目如何配置public靜態(tài)資源路徑訪問(wèn)
這篇文章主要介紹了vue項(xiàng)目如何配置public靜態(tài)資源路徑訪問(wèn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
vue前端自適應(yīng)布局實(shí)現(xiàn)教程(一步到位所有自適應(yīng))
?自適應(yīng)布局是一種根據(jù)不同的設(shè)備屏幕分辨率進(jìn)行布局的方式,它為不同的屏幕分辨率定義了不同的布局,下面這篇文章主要給大家介紹了關(guān)于vue前端自適應(yīng)布局實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2024-08-08
vue3超出文本展示el tooltip實(shí)現(xiàn)示例
這篇文章主要為大家介紹了vue3超出文本展示el tooltip實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
VUE UPLOAD 通過(guò)ACTION返回上傳結(jié)果操作
這篇文章主要介紹了VUE UPLOAD 通過(guò)ACTION返回上傳結(jié)果操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Vue監(jiān)聽(tīng)事件實(shí)現(xiàn)計(jì)數(shù)點(diǎn)擊依次增加的方法
今天小編就為大家分享一篇Vue監(jiān)聽(tīng)事件實(shí)現(xiàn)計(jì)數(shù)點(diǎn)擊依次增加的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue3 setup訪問(wèn)子組件的 DOM 元素的示例代碼
使用setup的情況下這個(gè)時(shí)候我們無(wú)法使用this,注意在setup中setup是封閉的,不會(huì)將子組件事件暴露出來(lái),所以要用defineExpose(),這篇文章主要介紹了vue3 setup訪問(wèn)子組件的 DOM 元素,需要的朋友可以參考下2023-08-08

