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

