深入了解Vue Pinia持久化存儲(chǔ)二次封裝
什么是 Pinia
Pinia 是2019年由vue.js官方成員重新設(shè)計(jì)的新一代狀態(tài)管理庫,類似Vuex。這里就不過多介紹,具體Pinia使用方法可以參考 Pinia 主頁。
下面我們一起研究一下基于Pinia開發(fā)的持久化存儲(chǔ)插件
什么是持久化存儲(chǔ)
簡單的說就是瀏覽器緩存與Store之間相互同步;我們在使用常規(guī)的Store存儲(chǔ)的時(shí)候,會(huì)遇到刷新頁面狀態(tài)庫就會(huì)被重置,這讓我們很苦惱;
通常遇到這個(gè)問題,我們很容易想到用sessionStorage或者localStorage來存儲(chǔ)相應(yīng)的數(shù)據(jù),當(dāng)存儲(chǔ)store變多時(shí),就麻煩了,需要寫一堆的廢代碼,不好閱讀也不美觀。
有沒有更好的辦法呢?pinia-plugin-persist 就很好的解決的這個(gè)問題; 但在實(shí)際使用中,發(fā)現(xiàn)一個(gè)不方便的地方,該插件是以模塊來存儲(chǔ)的,一個(gè)store就是一模塊,有時(shí)候我們需要一個(gè)一個(gè)字段去存,比如登錄我們就只需要存?zhèn)€userInfo字段就行;為了處理類似這種情況在pinia-plugin-persist基礎(chǔ)上進(jìn)行了升級(jí)改造。
相關(guān)源碼
index.d.ts
interface PersistStrategy {
key?: string
storage?: Storage
paths?: string[]
}
interface PersistOptions {
enabled: true
strategies?: PersistStrategy[]
}
declare module 'pinia' {
interface DefineStoreOptionsBase<S, Store> {
persist?: PersistOptions
}
}
export { PersistOptions, PersistStrategy }pinia-store-persist.ts
import { PiniaPluginContext } from 'pinia'
import { PersistStrategy } from '../pinia-persist'
type Store = PiniaPluginContext['store']
type PartialState = Partial<Store['$state']>
// 更新本地緩存
export const updateStorage = (strategy: PersistStrategy, store: Store) => {
const storage = strategy?.storage || sessionStorage
const paths = strategy?.paths || []
if (strategy.key) {
// 判斷是否按照模塊緩存
const state = paths.reduce((obj, key) => {
obj[key] = store.$state[key]
return obj
}, {} as PartialState)
storage.setItem(strategy.key, JSON.stringify(state))
} else {
// 單個(gè)緩存
paths.forEach((key) => {
const state = store.$state[key]
storage.setItem(key, JSON.stringify(state))
})
}
}
export default ({ options, store }: PiniaPluginContext): void => {
// 判斷插件功能是否開啟
if (options.persist?.enabled) {
// 默認(rèn)策略實(shí)例
const defaultStrategy = [
{
key: store.$id,
storage: sessionStorage,
paths: []
}
]
const strategies = options.persist?.strategies?.length ? options.persist?.strategies : defaultStrategy
strategies.forEach((strategy) => {
const storage = strategy?.storage || sessionStorage
const paths = strategy?.paths || []
if (strategy.key) {
const result = storage.getItem(strategy.key)
result && store.$patch(JSON.parse(result))
} else {
paths.forEach((key) => {
const result = storage.getItem(key)
if (result) {
const obj: { [key: string]: any } = {}
obj[key] = JSON.parse(result)
// 同步更新store數(shù)據(jù)
store.$patch(obj)
}
})
}
})
// 監(jiān)聽state變化,同步更新storage
store.$subscribe(() => {
strategies.forEach((strategy) => {
updateStorage(strategy, store)
})
})
}
}引入
store/index.ts
import { createPinia } from 'pinia'
import piniaStorePersist from '@/plugins/pinia-persist/pinia-store-persist'
const store = createPinia().use(piniaStorePersist)
export default store
使用
export const CommonStore = defineStore('common', {
//...
persist: {
enabled: true,
strategies: [
{
storage: localStorage,
paths: ['userInfo']
}
]
}
})
到此這篇關(guān)于深入了解Vue Pinia持久化存儲(chǔ)二次封裝的文章就介紹到這了,更多相關(guān)Vue Pinia存儲(chǔ)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue-cli3啟動(dòng)服務(wù)如何自動(dòng)打開瀏覽器配置
這篇文章主要介紹了vue-cli3啟動(dòng)服務(wù)如何自動(dòng)打開瀏覽器配置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
vue中js判斷長時(shí)間不操作界面自動(dòng)退出登錄(推薦)
這篇文章主要介紹了vue中js判斷長時(shí)間不操作界面自動(dòng)退出登錄,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
vue watch偵聽器有無immediate的運(yùn)行順序問題
這篇文章主要介紹了vue watch偵聽器有無immediate的運(yùn)行順序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
vue3實(shí)現(xiàn)點(diǎn)擊空白區(qū)域隱藏div
這篇文章主要介紹了vue3實(shí)現(xiàn)點(diǎn)擊空白區(qū)域隱藏div方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
vue3?+?element-plus?的?upload?+?axios?+?django?實(shí)現(xiàn)文件上
這篇文章主要介紹了vue3?+?element-plus?的?upload?+?axios?+?django?文件上傳并保存,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
vue如何實(shí)現(xiàn)點(diǎn)擊選中取消切換
這篇文章主要介紹了vue實(shí)現(xiàn)點(diǎn)擊選中取消切換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05

