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)文章希望大家以后多多支持腳本之家!
- Vite使用unplugin-auto-import實現(xiàn)vue3中的自動導(dǎo)入
- 3分鐘搞定vite項目(vue/react)使用vite-plugin-pwa配置為pwa應(yīng)用
- vue3項目導(dǎo)入異常Error:@vitejs/PLUGIN-vue?requires?vue?(>=3.2.13)解決辦法
- vue3+vite使用vite-plugin-svg-icons插件顯示本地svg圖標的方法
- Vite處理html模板插件之vite-plugin-html插件使用
- 解決vue3+vite配置unplugin-vue-component找不到Vant組件
- vite打包優(yōu)化vite-plugin-compression的使用示例詳解
- vue3+vite多項目多模塊打包(基于vite-plugin-html插件)
- 在?Vite項目中使用插件?@rollup/plugin-inject?注入全局?jQuery的過程詳解
- vue3+vite引入插件unplugin-auto-import的方法
- Vite Plugin 開發(fā)完全指南
相關(guān)文章
vue-cli項目使用mock數(shù)據(jù)的方法(借助express)
現(xiàn)如今前后端分離開發(fā)越來越普遍,前端人員寫好頁面后可以自己模擬一些數(shù)據(jù)進行代碼測試,這樣就不必等后端接口,提高了我們開發(fā)效率。今天就來分析下前端常用的mock數(shù)據(jù)的方式是如何實現(xiàn)的,需要的朋友可以參考下2019-04-04
Vue3+Ant?design?實現(xiàn)Select下拉框一鍵全選/清空功能
在做后臺管理系統(tǒng)項目的時候,產(chǎn)品增加了一個在Select選擇器中添加一鍵全選和清空的功能,他又不讓在外部增加按鈕,其實如果說在外部增加按鈕實現(xiàn)全選或者清空的話,功能比較簡單的,下面給大家分享Vue3+Ant?design?實現(xiàn)Select下拉框一鍵全選/清空功能,需要的朋友可以參考下2024-05-05
vue封裝自定義指令之動態(tài)顯示title操作(溢出顯示,不溢出不顯示)
這篇文章主要介紹了vue封裝自定義指令之動態(tài)顯示title操作(溢出顯示,不溢出不顯示),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11

