深入了解Vue Pinia持久化存儲二次封裝
什么是 Pinia
Pinia
是2019年由vue.js官方成員重新設(shè)計(jì)的新一代狀態(tài)管理庫,類似Vuex。這里就不過多介紹,具體Pinia使用方法可以參考 Pinia 主頁。
下面我們一起研究一下基于Pinia開發(fā)的持久化存儲插件
什么是持久化存儲
簡單的說就是瀏覽器緩存與Store之間相互同步;我們在使用常規(guī)的Store存儲的時(shí)候,會遇到刷新頁面狀態(tài)庫就會被重置,這讓我們很苦惱;
通常遇到這個(gè)問題,我們很容易想到用sessionStorage
或者localStorage
來存儲相應(yīng)的數(shù)據(jù),當(dāng)存儲store變多時(shí),就麻煩了,需要寫一堆的廢代碼,不好閱讀也不美觀。
有沒有更好的辦法呢?pinia-plugin-persist 就很好的解決的這個(gè)問題; 但在實(shí)際使用中,發(fā)現(xiàn)一個(gè)不方便的地方,該插件是以模塊來存儲的,一個(gè)store就是一模塊,有時(shí)候我們需要一個(gè)一個(gè)字段去存,比如登錄我們就只需要存?zhèn)€userInfo字段就行;為了處理類似這種情況在pinia-plugin-persist基礎(chǔ)上進(jìn)行了升級改造。
相關(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持久化存儲二次封裝的文章就介紹到這了,更多相關(guān)Vue Pinia存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue中js判斷長時(shí)間不操作界面自動退出登錄(推薦)
這篇文章主要介紹了vue中js判斷長時(shí)間不操作界面自動退出登錄,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01vue watch偵聽器有無immediate的運(yùn)行順序問題
這篇文章主要介紹了vue watch偵聽器有無immediate的運(yùn)行順序問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08vue3實(shí)現(xiàn)點(diǎn)擊空白區(qū)域隱藏div
這篇文章主要介紹了vue3實(shí)現(xiàn)點(diǎn)擊空白區(qū)域隱藏div方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04vue3?+?element-plus?的?upload?+?axios?+?django?實(shí)現(xiàn)文件上
這篇文章主要介紹了vue3?+?element-plus?的?upload?+?axios?+?django?文件上傳并保存,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01vue如何實(shí)現(xiàn)點(diǎn)擊選中取消切換
這篇文章主要介紹了vue實(shí)現(xiàn)點(diǎn)擊選中取消切換,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05