欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3+Vite項(xiàng)目中引入pinia和pinia-plugin-persistedstate的方法代碼

 更新時(shí)間:2024年11月22日 08:27:05   作者:九月兒  
這篇文章主要給大家介紹了關(guān)于Vue3+Vite項(xiàng)目中引入pinia和pinia-plugin-persistedstate的相關(guān)資料,Pinia是Vue.js的官方狀態(tài)管理庫(kù),輕量且功能強(qiáng)大,支持模塊化和TypeScript,PiniaPluginPersistedState是一個(gè)插件,需要的朋友可以參考下

一、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)值描述
enabledbooleanfalse是否啟用持久化存儲(chǔ)。
keystringStore 名稱存儲(chǔ)在 Storage 中的鍵名。
storageStoragelocalStorage存儲(chǔ)方式,可選 localStorage 或 sessionStorage。
pathsstring[]undefined選擇性持久化某些字段(不設(shè)置則默認(rèn)存儲(chǔ)全部)。
serializerobject內(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)文章

最新評(píng)論