深入呂昕開發的vuex插件:Pinia

一、簡介

Pinia 是一個由 Vue.js 核心成員 Luy 帶頭開發的 Vuex 替代品,它基於 Vue 3 composition API 構建,提供了一種更加簡潔優雅的狀態管理方案。

相比於 Vuex,Pinia在以下幾個方面提供了顯著的改進:

  • 支持 TypeScript
  • 數據響應式更新更加優化
  • 使用 composition API 來進行狀態管理編寫
  • 提供了插件機制,易於擴展
  • 支持多個 store 實例創建

二、安裝和基本使用

安裝 Pinia:

npm install pinia

在 Vue 3 的應用中,使用 createApp() 方法來創建實例:

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

const app = createApp(App)
app.use(createPinia())

app.mount('#app')

上述代碼中,我們使用 createPinia() 方法來創建一個名為 Pinia 的插件,同時將其安裝到 Vue 3 實例上,然後通過 app.mount() 來掛載應用。

接下來,來看一下如何在組件內部使用 Pinia 插件。

首先,需要定義一個 store 實例。

import { defineStore } from 'pinia'

export const useCounterStore = defineStore({
  id: 'counter',
  state: () => ({
    count: 0
  }),
  actions: {
    increment() {
      ++this.count
    }
  }
})

上面代碼中,我們使用 defineStore() 方法來定義一個名為 useCounterStore 的 store 實例,其中包含 state、mutations 和 actions 等屬性。

在使用 defineStore() 方法時,需要傳入一個配置對象,其中包含以下屬性:

  • id: String 類型,用來唯一標識此 store 實例。
  • state: Function 類型,用來返回此 store 實例的狀態對象。
  • actions: Object 類型,包含多個用於更新狀態的方法。
  • mutations: Object 類型,包含多個用於更新狀態的方法。
  • getters: Object 類型,包含多個讀取狀態值的方法。
  • actionsContext: Object 類型,包含多個上下文相關的方法。
  • mutationsContext: Object 類型,包含多個上下文相關的方法。

接下來,通過 useStore() 方法來使用 store 實例:

import { useCounterStore } from './store'

export default {
  setup() {
    const store = useCounterStore()

    const handleIncrement = () => {
      store.increment()
    }

    return {
      handleIncrement,
      count: store.count
    }
  }
}

上面的代碼中,我們使用 useCounterStore() 來獲取 useCounterStore 這個 store 實例對象,並將其賦值給一個變量 store,接着通過調用 store 實例對象中的 increment 方法來更新 count 狀態值的值。

三、插件機制

在需要對 Pinia 進行擴展或者自定義時,可以使用 Pinia 提供的 plugin 機制來實現,插件可以為 Store 實例添加更多的能力和特性,如:日誌記錄、數據持久化等。

下面是一個使用插件的示例:

import { createPinia } from 'pinia'
import { Storage } from '@ionic/storage'

const storage = new Storage()

const store = createPinia()

store.use((pinia) => {
  pinia.$onAction(({ type, payload }, state) => {
    console.log(`Action ${type} with payload`, payload, `updated with state`, state)
  })
  pinia.$onMutation(({ type, payload }) => {
    console.log(`Mutation ${type} with payload`, payload)
  })
  pinia.$subscribe((mutation, state) => {
    storage.set(mutation.type, state)
  })
  pinia.$restore(({ type }) => {
    return storage.get(type)
  })
})

上述代碼中,我們使用 use() 方法來安裝插件,然後在回調函數內部對 Store 實例添加了四個功能:

  • 使用 $onAction 方法來監聽 actions 的修改,並在控制台中輸出相關信息。
  • 使用 $onMutation 方法來監聽 mutations 的修改,並在控制台中輸出相關信息。
  • 使用 $subscribe 方法來監聽 state 的修改,並將修改後的數據進行持久化。
  • 使用 $restore 方法來獲取持久化的數據並還原到 store 實例中。

四、多個實例的創建

Pinia 提供多個 Store 實例的創建方式,可以根據不同的需要創建不同的實例。

下面是一個多個實例同時運行的示例:

// file: store.js

import { defineStore } from 'pinia'

export const useCounterStore = defineStore({
  id: 'counter',
  state: () => ({
    count: 0
  }),
  actions: {
    increment() {
      ++this.count
    }
  }
})

export const useTodoStore = defineStore({
  id: 'todo',
  state: () => ({
    todos: []
  }),
  actions: {
    add(todo) {
      this.todos.push(todo)
    }
  }
})

上述代碼中,我們分別定義了兩個 store 實例 useCounterStore 和 useTodoStore。

// file: main.js

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import { useCounterStore } from './store'

const app1 = createApp(App)
const app2 = createApp(App)

app1.use(createPinia())
app2.use(createPinia())

const store1 = useCounterStore()
const store2 = useCounterStore()

app1.config.globalProperties.$store = store1
app2.config.globalProperties.$store = store2

app1.mount('#app1')
app2.mount('#app2')

上述代碼中,我們首先通過 createApp() 方法來創建兩個不同的 Vue 3 實例 app1 和 app2,接着分別為兩個實例都安裝了 Pinia,並聲明了兩個不同的 useCounterStore 實例對象 store1 和 store2,最後將 store 實例存放到每個實例的全局屬性中,最終通過 app1 和 app2 來分別將兩個實例掛載到不同的元素上。

五、總結

通過上述的介紹,可以看出 Pinia 是一個功能強大的狀態管理方案,它比 Vuex 更加簡單、直觀、靈活,是 Vue 3 開發中值得推薦的一款工具。

在使用 Pinia 時,需要注意以下幾點:

  • 需要安裝插件才能夠實現更多的功能;
  • 支持 TypeScript,需要進行類型約束;
  • 使用 composition API 編寫狀態管理邏輯;
  • 支持多個 Store 實例的創建。

原創文章,作者:MIVTC,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/370049.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
MIVTC的頭像MIVTC
上一篇 2025-04-18 13:40
下一篇 2025-04-18 13:40

相關推薦

  • Codemaid插件——讓你的代碼優美整潔

    你是否曾為了混雜在代碼里的冗餘空格、重複代碼而感到煩惱?你是否曾因為代碼缺少注釋而陷入困境?為了解決這些問題,今天我要為大家推薦一款Visual Studio擴展插件——Codem…

    編程 2025-04-28
  • Kong 使用第三方的go插件

    本文將針對Kong使用第三方的go插件進行詳細闡述。首先,我們解答下標題的問題:如何使用第三方的go插件?我們可以通過編寫插件來達到此目的。 一、插件架構介紹 Kong的插件系統采…

    編程 2025-04-28
  • 按鍵精靈Python插件使用指南

    本篇文章將從安裝、基礎語法使用、實戰案例以及常用問題四個方面介紹按鍵精靈Python插件的使用方法。 一、安裝 安裝按鍵精靈Python插件非常簡單,只需在cmd命令行中輸入以下代…

    編程 2025-04-27
  • 如何在VS中安裝插件

    在VS中安裝插件可以幫助我們更好地編寫代碼,提高開發效率。以下是詳細的安裝教程。 一、獲取插件 首先,我們需要獲取要安裝的插件。可以在VS的插件管理界面(Tools -> E…

    編程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 和使用WebStorm插件

    一、插件簡介 WebStorm是一款為Web開發設計的IDE,它具有很強的功能和靈活的插件系統。 WebStorm的插件可以為開發人員提供更好的編碼體驗,增強開發速度和靈活性,使W…

    編程 2025-04-25

發表回復

登錄後才能評論