Vue3+Vite項(xiàng)目中引入pinia和pinia-plugin-persistedstate的方法代碼
一、Pinia
1. 簡(jiǎn)介
Pinia 是 Vue.js 官方推薦的狀態(tài)管理庫(kù),是 Vuex 的輕量替代品,設(shè)計(jì)更簡(jiǎn)單、功能更強(qiáng)大,并且支持模塊化和 TypeScript。
2. Pinia 的主要特點(diǎn)
簡(jiǎn)單易用:
API 設(shè)計(jì)直觀,與 Vue Composition API 深度結(jié)合。
支持模塊化:
每個(gè) store 獨(dú)立管理,減少全局 store 復(fù)雜性。
熱更新:
支持 HMR(Hot Module Replacement),開(kāi)發(fā)時(shí)無(wú)需手動(dòng)刷新。
支持 TypeScript:
提供更好的類型推導(dǎo)和代碼提示。
無(wú)依賴:
不需要額外的插件或中間件,集成更輕松。
二、Pinia Plugin PersistedState
1. 簡(jiǎn)介
pinia-plugin-persistedstate 是 Pinia 的一個(gè)插件,用于持久化存儲(chǔ)狀態(tài)。它將 store 的狀態(tài)保存在 localStorage 或 sessionStorage 中,即使頁(yè)面刷新或關(guān)閉后再次打開(kāi),狀態(tài)依然會(huì)被恢復(fù)。
2. 插件特點(diǎn)
- 支持存儲(chǔ)到 localStorage 或 sessionStorage。
- 可選擇性持久化某些 store 或字段。
- 集成簡(jiǎn)單,自動(dòng)同步狀態(tài)。
- 支持自定義序列化(如 JSON)和反序列化邏輯。
3. PersistedState 配置項(xiàng)
persist 字段用于配置持久化存儲(chǔ)的策略。
常見(jiàn)配置項(xiàng)
| 配置項(xiàng) | 類型 | 默認(rèn)值 | 描述 |
|---|---|---|---|
| enabled | boolean | false | 是否啟用持久化存儲(chǔ)。 |
| key | string | Store 名稱 | 存儲(chǔ)在 Storage 中的鍵名。 |
| storage | Storage | localStorage | 存儲(chǔ)方式,可選 localStorage 或 sessionStorage。 |
| paths | string[] | undefined | 選擇性持久化某些字段(不設(shè)置則默認(rèn)存儲(chǔ)全部)。 |
| serializer | object | 內(nèi)置 JSON 序列化器 | 自定義序列化器,包括 serialize 和 deserialize。 |
4. 示例:選擇性持久化字段
如果只想持久化 name 字段:
persist: {
enabled: true,
strategies: [
{
key: 'user',
storage: localStorage,
paths: ['name'], // 只持久化 `name`
},
],
},
5. 示例:自定義序列化器
如果需要自定義存儲(chǔ)格式(如 Base64):
persist: {
enabled: true,
strategies: [
{
key: 'user',
storage: sessionStorage,
serializer: {
serialize: (value) => btoa(JSON.stringify(value)), // Base64 編碼
deserialize: (value) => JSON.parse(atob(value)), // Base64 解碼
},
},
],
},
三、如何在項(xiàng)目中使用 Pinia 和 PersistedState
1. 安裝 Pinia 和 PersistedState 插件
npm install pinia pinia-plugin-persistedstate
2. 配置 Pinia
在項(xiàng)目的入口文件(如 main.ts 或 main.js)中:
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import piniaPluginPersistedState from 'pinia-plugin-persistedstate';
import App from './App.vue';
const app = createApp(App);
// 創(chuàng)建 Pinia 實(shí)例
const pinia = createPinia();
// 使用持久化插件
pinia.use(piniaPluginPersistedState);
app.use(pinia);
app.mount('#app');
3. 創(chuàng)建 Store
創(chuàng)建一個(gè)持久化的 Pinia store,例如 src/stores/user.ts:
import { defineStore } from 'pinia';
export const useUserStore = defineStore('user', () => {
const name = ref('王強(qiáng)')
const age = ref(25)
function setName(name: string) {
name.value = name
}
return {
name,
age,
setName
}
},
{
persist: {
storage: sessionStorage
}
}
)
4. 使用 Store
1. 讀取
<template>
<div>
<p>用戶名:{{ userStore.name }}</p>
<button @click="updateName">修改用戶名</button>
</div>
</template>
<script lang="ts" setup>
import { useUserStore } from '@/stores/user';
const userStore = useUserStore();
const updateName = () => {
userStore.setName('張三');
};
</script>
2. 更新
// 直接修改
userStore.name = '張三'
// 通過(guò) $patch({}) 批量對(duì)象修改
userStore.$patch({
name: '張三',
age:19
})
// 通過(guò) $patch((state) => {}) 回調(diào)函數(shù)修改
userStore.$patch((state) => {
state.name = '張三'
state.age = 19
})
// 通過(guò) action 修改
userStore.setName('張三');
3. 重置
將 store 中 state 重置為初始值
userStore.$reset()
4. 解構(gòu) storeToRefs
解構(gòu)會(huì)丟失響應(yīng)式,需要用 storeToRefs 轉(zhuǎn)為響應(yīng)式
import { storeToRefs } from 'pinia'
const userStore = useUsersStore()
const { name } = storeToRefs(userStore)
5. 監(jiān)聽(tīng) state 變化
監(jiān)聽(tīng)state變化
/**
* 當(dāng) state 中的值任意一個(gè)發(fā)生變化的時(shí)候,就會(huì)觸發(fā)該函數(shù)
*
* args: 里面會(huì)記錄新舊值
* state:就是當(dāng)前操作的 state 的實(shí)例
* options: 是一個(gè)對(duì)象,比如 detached,這是一個(gè) boolean 參數(shù),當(dāng)這個(gè)參數(shù)為 true 時(shí),表明即使當(dāng)前組件銷(xiāo)毀后,也繼續(xù)監(jiān)控 state 里面值的變化,可選
*/
userStore.$subscribe((args, state) => {
console.log('args', args)
console.log('state', state)
},{
detached: true
})
6. 監(jiān)聽(tīng) action 調(diào)用
當(dāng)調(diào)用函數(shù)的時(shí)候,就會(huì)觸發(fā)該函數(shù)
/**
* 當(dāng)調(diào)用 actions 里面的函數(shù)的時(shí)候,就會(huì)觸發(fā)改函數(shù)
*
* args:接收參數(shù),里面封裝了多個(gè) api:
* args.after:當(dāng) $onAction 里面的邏輯執(zhí)行完成之后才會(huì)執(zhí)行 args.after 函數(shù)邏輯,所以 args.after 放置的位置于執(zhí)行順序無(wú)關(guān)
* args.onError:當(dāng)調(diào)用 actions 里面的函數(shù)發(fā)生錯(cuò)誤時(shí),args.onError 函數(shù)也會(huì)執(zhí)行
* args.args:接收調(diào)用 actions 里面的函數(shù)傳遞的參數(shù),是一個(gè)數(shù)組
* args.name:執(zhí)行的 actions 里面的函數(shù)的名稱
* detached: 這是一個(gè) boolean 參數(shù),當(dāng)這個(gè)參數(shù)為 true 時(shí),表明即使當(dāng)前組件銷(xiāo)毀時(shí),也繼續(xù)監(jiān)控 actions 里面的函數(shù)調(diào)用,可選
*/
userStore.$onAction((args) => {
args.after(() => console.log("args.after", "===="));
console.log("args", args);
}, true);總結(jié)
到此這篇關(guān)于Vue3+Vite項(xiàng)目中引入pinia和pinia-plugin-persistedstate的文章就介紹到這了,更多相關(guān)Vue3+Vite引入pinia和pinia-plugin-persistedstate內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue tagsview實(shí)現(xiàn)多頁(yè)簽導(dǎo)航功能流程詳解
基本上后臺(tái)管理系統(tǒng)都需要有多頁(yè)簽的功能,但是因?yàn)橐恍┠_手架項(xiàng)目基本都把這個(gè)功能給集成好了,導(dǎo)致在學(xué)習(xí)或者修改的時(shí)候不知道該如何下手。今天這篇文章就來(lái)聊一聊,vue-element-admin項(xiàng)目是如何實(shí)現(xiàn)多頁(yè)簽功能的2022-09-09
利用Vue3實(shí)現(xiàn)鼠標(biāo)跟隨效果
在Web開(kāi)發(fā)領(lǐng)域,鼠標(biāo)跟隨效果是一種能顯著提升頁(yè)面交互性、增加動(dòng)態(tài)感與趣味性的常見(jiàn)方式,下面我們看看如何使用Vue3實(shí)現(xiàn)鼠標(biāo)跟隨效果吧2024-11-11
vue-cli構(gòu)建的項(xiàng)目如何手動(dòng)添加eslint配置
這篇文章主要介紹了vue-cli構(gòu)建的項(xiàng)目如何手動(dòng)添加eslint配置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
完美解決vue中報(bào)錯(cuò)?“TypeError:?Cannot?read?properties?of?null?
這篇文章主要介紹了完美解決vue中報(bào)錯(cuò)?“TypeError:?Cannot?read?properties?of?null?(reading?‘forEach‘)“,本文給大家分享詳細(xì)解決方案,需要的朋友可以參考下2023-02-02
Vue項(xiàng)目發(fā)布后瀏覽器緩存問(wèn)題解決方案
在vue項(xiàng)目開(kāi)發(fā)中一直有一個(gè)令人都疼的問(wèn)題,就是緩存問(wèn)題,這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目發(fā)布后瀏覽器緩存問(wèn)題的解決方案,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
VUE異步更新DOM - 用$nextTick解決DOM視圖的問(wèn)題
這篇文章主要介紹了VUE異步更新DOM - 用$nextTick解決DOM視圖的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
vue從倉(cāng)庫(kù)state中取不到數(shù)據(jù)的問(wèn)題
這篇文章主要介紹了vue從倉(cāng)庫(kù)state中取不到數(shù)據(jù)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
Vue3中reactive與ref函數(shù)使用場(chǎng)景
這篇文章主要為大家介紹了Vue3?中有場(chǎng)景是?reactive?能做而?ref?做不了的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
vue實(shí)現(xiàn)路由鑒權(quán)和不同用戶登錄
這篇文章主要為大家詳細(xì)介紹了vue中實(shí)現(xiàn)路由鑒權(quán)和不同用戶登錄的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04

