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),開發(fā)時(shí)無需手動(dòng)刷新。
支持 TypeScript:
提供更好的類型推導(dǎo)和代碼提示。
無依賴:
不需要額外的插件或中間件,集成更輕松。
二、Pinia Plugin PersistedState
1. 簡(jiǎn)介
pinia-plugin-persistedstate 是 Pinia 的一個(gè)插件,用于持久化存儲(chǔ)狀態(tài)。它將 store 的狀態(tài)保存在 localStorage 或 sessionStorage 中,即使頁(yè)面刷新或關(guān)閉后再次打開,狀態(tài)依然會(huì)被恢復(fù)。
2. 插件特點(diǎn)
- 支持存儲(chǔ)到 localStorage 或 sessionStorage。
- 可選擇性持久化某些 store 或字段。
- 集成簡(jiǎn)單,自動(dòng)同步狀態(tài)。
- 支持自定義序列化(如 JSON)和反序列化邏輯。
3. PersistedState 配置項(xiàng)
persist 字段用于配置持久化存儲(chǔ)的策略。
常見配置項(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 = '張三' // 通過 $patch({}) 批量對(duì)象修改 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)會(huì)丟失響應(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 中的值任意一個(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)前組件銷毀后,也繼續(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ù)的時(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í)行順序無關(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)前組件銷毀時(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í)候不知道該如何下手。今天這篇文章就來聊一聊,vue-element-admin項(xiàng)目是如何實(shí)現(xiàn)多頁(yè)簽功能的2022-09-09利用Vue3實(shí)現(xiàn)鼠標(biāo)跟隨效果
在Web開發(fā)領(lǐng)域,鼠標(biāo)跟隨效果是一種能顯著提升頁(yè)面交互性、增加動(dòng)態(tài)感與趣味性的常見方式,下面我們看看如何使用Vue3實(shí)現(xiàn)鼠標(biāo)跟隨效果吧2024-11-11vue-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-02Vue項(xiàng)目發(fā)布后瀏覽器緩存問題解決方案
在vue項(xiàng)目開發(fā)中一直有一個(gè)令人都疼的問題,就是緩存問題,這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目發(fā)布后瀏覽器緩存問題的解決方案,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09VUE異步更新DOM - 用$nextTick解決DOM視圖的問題
這篇文章主要介紹了VUE異步更新DOM - 用$nextTick解決DOM視圖的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11vue從倉(cāng)庫(kù)state中取不到數(shù)據(jù)的問題
這篇文章主要介紹了vue從倉(cāng)庫(kù)state中取不到數(shù)據(jù)的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04Vue3中reactive與ref函數(shù)使用場(chǎng)景
這篇文章主要為大家介紹了Vue3?中有場(chǎng)景是?reactive?能做而?ref?做不了的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07vue實(shí)現(xiàn)路由鑒權(quán)和不同用戶登錄
這篇文章主要為大家詳細(xì)介紹了vue中實(shí)現(xiàn)路由鑒權(quán)和不同用戶登錄的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04