最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

什么是 Pinia 

Pinia 是2019年由vue.js官方成員重新設(shè)計的新一代狀態(tài)管理庫,類似Vuex。這里就不過多介紹,具體Pinia使用方法可以參考 Pinia 主頁。

下面我們一起研究一下基于Pinia開發(fā)的持久化存儲插件

什么是持久化存儲

簡單的說就是瀏覽器緩存與Store之間相互同步;我們在使用常規(guī)的Store存儲的時候,會遇到刷新頁面狀態(tài)庫就會被重置,這讓我們很苦惱;
通常遇到這個問題,我們很容易想到用sessionStorage或者localStorage來存儲相應(yīng)的數(shù)據(jù),當(dāng)存儲store變多時,就麻煩了,需要寫一堆的廢代碼,不好閱讀也不美觀。

有沒有更好的辦法呢?pinia-plugin-persist 就很好的解決的這個問題; 但在實際使用中,發(fā)現(xiàn)一個不方便的地方,該插件是以模塊來存儲的,一個store就是一模塊,有時候我們需要一個一個字段去存,比如登錄我們就只需要存?zhèn)€userInfo字段就行;為了處理類似這種情況在pinia-plugin-persist基礎(chǔ)上進行了升級改造。

相關(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 {
    // 單個緩存
    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數(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)文章

  • Vue3中的事件總線詳解

    Vue3中的事件總線詳解

    在Vue3中,推薦使用CompositionAPI和第三方庫mitt來實現(xiàn)事件總線,而不是Vue2中使用Vue實例的方式
    2026-01-01
  • 詳解vuex數(shù)據(jù)傳輸?shù)膬煞N方式及this.$store undefined的解決辦法

    詳解vuex數(shù)據(jù)傳輸?shù)膬煞N方式及this.$store undefined的解決辦法

    這篇文章主要介紹了vuex數(shù)據(jù)傳輸?shù)膬煞N方式 及 this.$store undefined的解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • vue自定義數(shù)字輸入框組件

    vue自定義數(shù)字輸入框組件

    這篇文章主要為大家詳細介紹了vue自定義數(shù)字輸入框組件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 前端vue3使用axios調(diào)用后端接口的實現(xiàn)方法

    前端vue3使用axios調(diào)用后端接口的實現(xiàn)方法

    vue本身不支持ajax接口的請求,所以在vue中經(jīng)常使用axios這個接口請求工具,下面這篇文章主要給大家介紹了關(guān)于前端vue3使用axios調(diào)用后端接口的實現(xiàn)方法,需要的朋友可以參考下
    2022-12-12
  • Vue中使用eslint和editorconfig方式

    Vue中使用eslint和editorconfig方式

    這篇文章主要介紹了Vue中使用eslint和editorconfig方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue一步到位的實現(xiàn)動態(tài)路由

    vue一步到位的實現(xiàn)動態(tài)路由

    這篇文章主要介紹了vue一步到位的實現(xiàn)動態(tài)路由,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Vue消息訂閱與發(fā)布過程

    Vue消息訂閱與發(fā)布過程

    發(fā)布-訂閱模式是一種設(shè)計模式,通過事件中心實現(xiàn)對象間的解耦通信,在Vue中,Vue2使用Vue實例作為事件總線,Vue3推薦使用mitt庫,發(fā)布-訂閱模式適用于廣播通知、解耦組件和復(fù)雜狀態(tài)管理,在選擇工具時,建議根據(jù)場景選擇合適的工具
    2025-11-11
  • vue實現(xiàn)圖片平鋪方式

    vue實現(xiàn)圖片平鋪方式

    在Vue中,實現(xiàn)圖片或組件的平鋪布局并允許用戶進行修改,可以通過數(shù)據(jù)綁定、模板編寫與交互設(shè)計來實現(xiàn)圖片平鋪,使用v-for指令和動態(tài)組件,可以創(chuàng)建可編輯的組件平鋪布局,允許用戶通過點擊觸發(fā)編輯操作,通過外部編輯面板修改屬性后保存更改
    2024-10-10
  • VUE.CLI4.0配置多頁面入口的實現(xiàn)

    VUE.CLI4.0配置多頁面入口的實現(xiàn)

    這篇文章主要介紹了VUE.CLI4.0配置多頁面入口的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 使用element組件table表格實現(xiàn)某條件下復(fù)選框無法勾選

    使用element組件table表格實現(xiàn)某條件下復(fù)選框無法勾選

    這篇文章主要介紹了使用element組件table表格實現(xiàn)某條件下復(fù)選框無法勾選問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評論

通海县| 沁源县| 邯郸市| 耿马| 延川县| 甘孜| 成武县| 房产| 左贡县| 绥滨县| 建平县| 休宁县| 武穴市| 福泉市| 武功县| 昌都县| 会理县| 诏安县| 辉南县| 红原县| 太和县| 大丰市| 泽州县| 仙居县| 兴化市| 城固县| 太湖县| 炉霍县| 科技| 镇平县| 凤阳县| 郸城县| 通化市| 平和县| 招远市| 桓仁| 大新县| 泾川县| 旬邑县| 察隅县| 沙坪坝区|