深入了解Vue Pinia持久化存储二次封装
什么是 Pinia
Pinia
是2019年由vue.js官方成员重新设计的新一代状态管理库,类似Vuex。这里就不过多介绍,具体Pinia使用方法可以参考 Pinia 主页。
下面我们一起研究一下基于Pinia开发的持久化存储插件
什么是持久化存储
简单的说就是浏览器缓存与Store之间相互同步;我们在使用常规的Store存储的时候,会遇到刷新页面状态库就会被重置,这让我们很苦恼;
通常遇到这个问题,我们很容易想到用sessionStorage
或者localStorage
来存储相应的数据,当存储store变多时,就麻烦了,需要写一堆的废代码,不好阅读也不美观。
有没有更好的办法呢?pinia-plugin-persist 就很好的解决的这个问题; 但在实际使用中,发现一个不方便的地方,该插件是以模块来存储的,一个store就是一模块,有时候我们需要一个一个字段去存,比如登录我们就只需要存个userInfo字段就行;为了处理类似这种情况在pinia-plugin-persist基础上进行了升级改造。
相关源码
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 { // 单个缓存 paths.forEach((key) => { const state = store.$state[key] storage.setItem(key, JSON.stringify(state)) }) } } export default ({ options, store }: PiniaPluginContext): void => { // 判断插件功能是否开启 if (options.persist?.enabled) { // 默认策略实例 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数据 store.$patch(obj) } }) } }) // 监听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'] } ] } })
到此这篇关于深入了解Vue Pinia持久化存储二次封装的文章就介绍到这了,更多相关Vue Pinia存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
今天小编就为大家分享一篇vue2.0$nextTick监听数据渲染完成之后的回调函数方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-09-09vue通过v-html指令渲染的富文本无法修改样式的解决方案
这篇文章主要介绍了vue通过v-html指令渲染的富文本无法修改样式的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-05-05
最新评论