Vue3+Vite項目中引入pinia和pinia-plugin-persistedstate的方法代碼
一、Pinia
1. 簡介
Pinia 是 Vue.js 官方推薦的狀態(tài)管理庫,是 Vuex 的輕量替代品,設(shè)計更簡單、功能更強大,并且支持模塊化和 TypeScript。
2. Pinia 的主要特點
簡單易用:
API 設(shè)計直觀,與 Vue Composition API 深度結(jié)合。
支持模塊化:
每個 store 獨立管理,減少全局 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. 插件特點
- 支持存儲到 localStorage 或 sessionStorage。
- 可選擇性持久化某些 store 或字段。
- 集成簡單,自動同步狀態(tài)。
- 支持自定義序列化(如 JSON)和反序列化邏輯。
3. PersistedState 配置項
persist 字段用于配置持久化存儲的策略。
常見配置項
配置項 | 類型 | 默認值 | 描述 |
---|---|---|---|
enabled | boolean | false | 是否啟用持久化存儲。 |
key | string | Store 名稱 | 存儲在 Storage 中的鍵名。 |
storage | Storage | localStorage | 存儲方式,可選 localStorage 或 sessionStorage。 |
paths | string[] | undefined | 選擇性持久化某些字段(不設(shè)置則默認存儲全部)。 |
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 解碼 }, }, ], },
三、如何在項目中使用 Pinia 和 PersistedState
1. 安裝 Pinia 和 PersistedState 插件
npm install pinia pinia-plugin-persistedstate
2. 配置 Pinia
在項目的入口文件(如 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 實例 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('王強') 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 的實例 * 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項目中引入pinia和pinia-plugin-persistedstate的文章就介紹到這了,更多相關(guān)Vue3+Vite引入pinia和pinia-plugin-persistedstate內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue tagsview實現(xiàn)多頁簽導(dǎo)航功能流程詳解
基本上后臺管理系統(tǒng)都需要有多頁簽的功能,但是因為一些腳手架項目基本都把這個功能給集成好了,導(dǎo)致在學(xué)習(xí)或者修改的時候不知道該如何下手。今天這篇文章就來聊一聊,vue-element-admin項目是如何實現(xiàn)多頁簽功能的2022-09-09vue-cli構(gòu)建的項目如何手動添加eslint配置
這篇文章主要介紹了vue-cli構(gòu)建的項目如何手動添加eslint配置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04完美解決vue中報錯?“TypeError:?Cannot?read?properties?of?null?
這篇文章主要介紹了完美解決vue中報錯?“TypeError:?Cannot?read?properties?of?null?(reading?‘forEach‘)“,本文給大家分享詳細解決方案,需要的朋友可以參考下2023-02-02VUE異步更新DOM - 用$nextTick解決DOM視圖的問題
這篇文章主要介紹了VUE異步更新DOM - 用$nextTick解決DOM視圖的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11