搜尋
首頁web前端Vue.js分享Vue3全新狀態管理工具:Pinia

分享Vue3全新狀態管理工具:Pinia

Dec 16, 2021 am 10:42 AM
vue.jsvuex前端狀態管理

這篇文章跟大家分享介紹一下全新的 Vue3 狀態管理工具:Pinia,聊聊Pinia工具的安裝和使用方法,希望對大家有幫助。

分享Vue3全新狀態管理工具:Pinia

全新的Vue3 狀態管理工具:Pinia

Vue3 發布已經有一段時間了,它採用了新的響應式系統,而且建構了一套全新的Composition API。 Vue 的周邊生態都在加緊適配這套新的系統,官方的狀態管理庫 Vuex 也在適配中,為此官方提出了一個 Vuex 5 的全新提案。 【相關推薦:《vue.js教學》】

分享Vue3全新狀態管理工具:Pinia

  • #支援兩種文法建立Store:Options ApiComposition Api;
  • 刪除mutations,只支援stategettersactions# ;
  • 模組化的設計,能很好地支援程式碼分割;
  • 沒有巢狀的模組,只有Store 的概念;
  • 完整的TypeScript 支持;

在這個提案下方,有個評論很有意思。簡單翻譯一下:

分享Vue3全新狀態管理工具:Pinia

好巧不巧,Vuex5 的提案,與Pinia 實現的功能不能說毫無關係,只能說一模一樣,今天的文章就來給大家介紹一下這個鳳梨。

安裝

在現有專案中,使用下列指令進行 Pinia 模組的安裝。

# yarn
yarn add pinia@next
# npm
npm i pinia@next

安裝完成後,需要在 Vue3 專案的入口檔案中,進行匯入安裝。

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

// 实例化 Vue
const app = createApp(App)
// 安装 Pinia
app.use(createPinia())
// 挂载在真实 DOM
app.mount('#app')

上手

要使用 Pinia 的話,只需要定義一個 store,然後在用到該資料的地方進行匯入。

定義Store

import { defineStore } from "pinia"

// 对外部暴露一个 use 方法,该方法会导出我们定义的 state
const useCounterStore = defineStore({
  // 每个 store 的 id 必须唯一
  id: 'counter',
  // state 表示数据源
  state: () => ({
    count: 0
  }),
  // getters 类似于 computed,可对 state 的值进行二次计算
  getters: {
    double () {
        // getter 中的 this 指向 state
        return this.count * 2
      },
      // 如果使用箭头函数会导致 this 指向有问题
      // 可以在函数的第一个参数中拿到 state
    double: (state) => {
        return state.count * 2
      }
  },
  // actions 用来修改 state
  actions: {
    increment() {
      // action 中的 this 指向 state
      this.count++
    },
  }
})

export default useCounterStore

除了使用上述類似vuex 的方式來建立state,還可以使用function 的形式來建立store,有點類似於Vue3 中的setup()

import { ref, computed } from "vue"
import { defineStore } from "pinia"

// 对外部暴露一个 use 方法,该方法会导出我们定义的 state
const useCounterStore = defineStore('counter', function () {
  const count = ref(0)
  const double = computed(() => count.value * 2)
  function increment() {
    count.value++
  }
  return {
      count, double, increment
  }
})

export default useCounterStore

使用Store

前面也介紹過,Pinia 提供了兩種方式來使用store,Options ApiComposition Api 中都完美支援。

Options Api

Options Api 中,可直接使用官方提供的mapActionsmapState 方法,匯出store 的state、getter、action,其用法與Vuex 基本一致,很容易上手。

import { mapActions, mapState } from 'pinia'
import { useCounterStore } from '../model/counter'

export default {
  name: 'HelloWorld',
  computed: {
    ...mapState(useCounterStore, ['count', 'double'])
  },
  methods: {
    ...mapActions(useCounterStore, ['increment'])
  }
}

Composition Api

Composition Api 中,不管是state 或getter 都需要透過computed 方法來監聽變化,這和Options Api 中,需要放到computed 物件中的道理一樣。另外, Options Api  中拿到的 state 值是可以直接進行修改操作的,當然還是建議寫一個 action 來操作 state 值,方便後製。

// Composition Api
import { computed } from 'vue'
import { useCounterStore } from '../stores/counter'
export default {
  name: 'HelloWorld',
  setup() {
    const counter = useCounterStore()
    return {
      // state 和 getter 都需要在使用 computed,这和 Options Api 一样
      count: computed(() => counter.count),
      double: computed(() => counter.double),
      increment: () => { counter.count++ }, // 可以直接修改 state 的值
      increment: counter.increment, // 可以引用 store 中定义的 action
    }
  }
}

類型提示

在 Vuex 中,TypeScript 的類型提示做得不是很好,在進行類型推導時,只能找到它的 state。特別是在寫程式碼的過程中,程式碼提示就很不聰明。

分享Vue3全新狀態管理工具:Pinia

而 pinia,就能推導出所有定義的 state、getter、action,這樣在寫程式碼的時候,就會方便很多。

分享Vue3全新狀態管理工具:Pinia

分享Vue3全新狀態管理工具:Pinia

主要是pinia 透過TypeScript 進行了十分友善的類型定義,感興趣的可以看看pinia 的類型定義檔(pinia.d.ts):

分享Vue3全新狀態管理工具:Pinia

程式碼分割

由於使用了模組化設計,所有的store 都能夠單獨引入,而不是像vuex 一樣,透過modules 的方式,將所有的module 掛載到一個store 上。

假設,我們目前透過 Vuex 建立了一個 Store,這個 Store 下有兩個 module,分別是使用者模組(User)和商品模組(Goods)。即使目前首頁只使用到了使用者訊息,但是整個 Store 都會被打包到首頁的 js chunk 中。

分享Vue3全新狀態管理工具:Pinia

分享Vue3全新狀態管理工具:Pinia

如果我們使用 pinia,我們會使用 defineStore 定義兩個 完全是分離狀態的 store,兩個頁面在引入時,也互不影響。最後打包的時候,首頁的 js chunk 和商品頁的 js chunk 會分別打包對應的 store。

分享Vue3全新狀態管理工具:Pinia

Pinia 的介紹到這裡就告一段落了,如果現在有新專案要使用 Vue3 進行開發,推薦無腦使用 Pinia,更加簡潔,而且大小僅 1KB。

更多程式相關知識,請造訪:程式設計入門! !

以上是分享Vue3全新狀態管理工具:Pinia的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除
vue.js vs.後端框架:澄清區別vue.js vs.後端框架:澄清區別Apr 25, 2025 am 12:05 AM

Vue.js是前端框架,後端框架用於處理服務器端邏輯。 1)Vue.js專注於構建用戶界面,通過組件化和響應式數據綁定簡化開發。 2)後端框架如Express、Django處理HTTP請求、數據庫操作和業務邏輯,運行在服務器上。

vue.js和前端堆棧:了解連接vue.js和前端堆棧:了解連接Apr 24, 2025 am 12:19 AM

Vue.js與前端技術棧緊密集成,提升開發效率和用戶體驗。 1)構建工具:與Webpack、Rollup集成,實現模塊化開發。 2)狀態管理:與Vuex集成,管理複雜應用狀態。 3)路由:與VueRouter集成,實現單頁面應用路由。 4)CSS預處理器:支持Sass、Less,提升樣式開發效率。

Netflix:探索React(或其他框架)的使用Netflix:探索React(或其他框架)的使用Apr 23, 2025 am 12:02 AM

Netflix選擇React來構建其用戶界面,因為React的組件化設計和虛擬DOM機制能夠高效處理複雜界面和頻繁更新。 1)組件化設計讓Netflix將界面分解成可管理的小組件,提高了開發效率和代碼可維護性。 2)虛擬DOM機制通過最小化DOM操作,確保了Netflix用戶界面的流暢性和高性能。

vue.js和前端:深入研究框架vue.js和前端:深入研究框架Apr 22, 2025 am 12:04 AM

Vue.js被開發者喜愛因為它易於上手且功能強大。 1)其響應式數據綁定係統自動更新視圖。 2)組件系統提高了代碼的可重用性和可維護性。 3)計算屬性和偵聽器增強了代碼的可讀性和性能。 4)使用VueDevtools和檢查控制台錯誤是常見的調試技巧。 5)性能優化包括使用key屬性、計算屬性和keep-alive組件。 6)最佳實踐包括清晰的組件命名、使用單文件組件和合理使用生命週期鉤子。

vue.js在前端的力量:關鍵特徵和好處vue.js在前端的力量:關鍵特徵和好處Apr 21, 2025 am 12:07 AM

Vue.js是一個漸進式的JavaScript框架,適用於構建高效、可維護的前端應用。其關鍵特性包括:1.響應式數據綁定,2.組件化開發,3.虛擬DOM。通過這些特性,Vue.js簡化了開發過程,提高了應用性能和可維護性,使其在現代Web開發中備受歡迎。

vue.js比反應好嗎?vue.js比反應好嗎?Apr 20, 2025 am 12:05 AM

Vue.js和React各有優劣,選擇取決於項目需求和團隊情況。 1)Vue.js適合小型項目和初學者,因其簡潔和易上手;2)React適用於大型項目和復雜UI,因其豐富的生態系統和組件化設計。

vue.js的功能:增強前端的用戶體驗vue.js的功能:增強前端的用戶體驗Apr 19, 2025 am 12:13 AM

Vue.js通過多種功能提升用戶體驗:1.響應式系統實現數據即時反饋;2.組件化開發提高代碼復用性;3.VueRouter提供平滑導航;4.動態數據綁定和過渡動畫增強交互效果;5.錯誤處理機制確保用戶反饋;6.性能優化和最佳實踐提升應用性能。

vue.js:定義其在網絡開發中的作用vue.js:定義其在網絡開發中的作用Apr 18, 2025 am 12:07 AM

Vue.js在Web開發中的角色是作為一個漸進式JavaScript框架,簡化開發過程並提高效率。 1)它通過響應式數據綁定和組件化開發,使開發者能專注於業務邏輯。 2)Vue.js的工作原理依賴於響應式系統和虛擬DOM,優化性能。 3)實際項目中,使用Vuex管理全局狀態和優化數據響應性是常見實踐。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。