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

深入了解Vue Pinia持久化存儲二次封裝

 更新時(shí)間:2023年12月21日 16:52:36   作者:前端老K  
Pinia 是2019年由vue.js官方成員重新設(shè)計(jì)的新一代狀態(tài)管理庫,類似Vuex,下面我們就來學(xué)習(xí)一下如何通過Pinia實(shí)現(xiàn)持久化存儲的相關(guān)知識,感興趣的小伙伴可以了解下

什么是 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)文章

  • vuex 中插件的編寫案例解析

    vuex 中插件的編寫案例解析

    Vuex 的 store 接受 plugins 選項(xiàng),這個(gè)選項(xiàng)暴露出每次 mutation 的鉤子。Vuex 插件就是一個(gè)函數(shù),這篇文章主要介紹了vuex 中插件的編寫案例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • vue-cli3啟動服務(wù)如何自動打開瀏覽器配置

    vue-cli3啟動服務(wù)如何自動打開瀏覽器配置

    這篇文章主要介紹了vue-cli3啟動服務(wù)如何自動打開瀏覽器配置,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue插件及修改ip啟動端口解析

    vue插件及修改ip啟動端口解析

    這篇文章主要為大家介紹了vue插件及修改ip啟動端口的解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • vue中js判斷長時(shí)間不操作界面自動退出登錄(推薦)

    vue中js判斷長時(shí)間不操作界面自動退出登錄(推薦)

    這篇文章主要介紹了vue中js判斷長時(shí)間不操作界面自動退出登錄,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • vue watch偵聽器有無immediate的運(yùn)行順序問題

    vue watch偵聽器有無immediate的運(yùn)行順序問題

    這篇文章主要介紹了vue watch偵聽器有無immediate的運(yùn)行順序問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • vue3實(shí)現(xiàn)點(diǎn)擊空白區(qū)域隱藏div

    vue3實(shí)現(xiàn)點(diǎn)擊空白區(qū)域隱藏div

    這篇文章主要介紹了vue3實(shí)現(xiàn)點(diǎn)擊空白區(qū)域隱藏div方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • vue+高德地圖寫地圖選址組件的方法

    vue+高德地圖寫地圖選址組件的方法

    這篇文章主要介紹了vue+高德地圖寫地圖選址組件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Vue之組件詳解

    Vue之組件詳解

    這篇文章主要為大家介紹了Vue之組件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • vue3?+?element-plus?的?upload?+?axios?+?django?實(shí)現(xiàn)文件上傳并保存功能

    vue3?+?element-plus?的?upload?+?axios?+?django?實(shí)現(xiàn)文件上

    這篇文章主要介紹了vue3?+?element-plus?的?upload?+?axios?+?django?文件上傳并保存,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • vue如何實(shí)現(xiàn)點(diǎn)擊選中取消切換

    vue如何實(shí)現(xiàn)點(diǎn)擊選中取消切換

    這篇文章主要介紹了vue實(shí)現(xiàn)點(diǎn)擊選中取消切換,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論