pinia 相比 vuex 的優勢
1.Pinia 是什麼?
你可能聽說過pinia
是vue
官方推薦的狀態管理庫,尤大甚至稱pinia
是事實上的vuex5
,但是你是否知道相比vuex
爲什麼要使用pinia
以及如何使用pinia
,本文將解釋爲什麼pinia
在狀態管理方面更勝一籌。
2.pinia
的作者是誰
pinia
的作者是 Eduardo San Martin Morote,同時也是Vue Router
的創造者,是vue
核心團隊成員之一。
3.Pinia
是否能在vue2
和vue3
下運行
是的,pinia
和vue
的兩個主要版本都兼容。
4.pinia
和vuex
之間的比較
4.1 pinia
的api
更加簡單
Pinia
的 API 比Vuex
更簡單、更直觀。因爲vuex
中每個狀態更改需要編寫的大量代碼在pinia
中已經刪除了,這使得即使是初級開發人員也不會覺得狀態管理難。
一個pinia
的例子
運行以下代碼在我們的 vue app 中安裝pinia
yarn add pinia
# or with npm
npm install pinia
更改main.js
來使用pinia
import { createApp } from "vue";
import { createPinia } from "pinia";
import App from "./App.vue";
const app = createApp(App);
app.use(createPinia());
app.mount("#app");
在 src 目錄下創建 stores 文件夾,然後再創建一個 counter.js 文件,並粘貼以下代碼:
src/stores/counter.js
import { defineStore } from "pinia";
export const useCounterStore = defineStore("counter", {
state: () => {
return { count: 0 };
},
actions: {
increment(value = 1) {
this.count += value;
},
},
getters: {
doubleCount: (state) => {
return state.count * 2;
},
doublePlusOne() {
return this.doubleCount + 1
},
},
});
關於以上代碼,我們需要看到的是:
-
Mutations
已經從整個狀態管理週期中移除,pinia
中我們可以直接通過action
更改狀態,從而減少冗餘代碼。 -
pinia actions
中已經不在需要諸如context
之類的額外參數了,我們還可以通過store.$onAction()
監聽action
的動作及結果。 -
pinia
的getters
可以通過this
訪問整個store
實例。這些更改使的Pinia
代碼與Vuex
代碼相比更易於閱讀和理解。
4.2 Pinia
採用模塊化設計
vuex
只有一個store
, 在其中可以包含多個模塊,但是在pinia
中,我們可以直接創建多個store
, 這些store
可以直接按需導入到組件中,這有利於更好的代碼分隔,並更有利於TypeScript
的類型推斷。採用多個store
替代一個store
也簡化了開發。在前面例子的基礎上,單文件組件中使用pinia
,代碼如下所示:
<script setup>
import { useCounterStore } from "./stores/counter";
const store = useCounterStore();
</script>
<template>
<h1>Count is {{ store.count }}</h1>
<h2>Double is {{ store.doubleCount }}</h2>
<button @click="store.increment()">Increment</button>
</template>
4.3 Devtools
也附帶pinia
如果你熟悉vuex
,應該使用過DevTools
的vuex
選項卡,可能知道區分 actions
和 mutations
並不是爲了解決競態問題,而是爲了能用 devtools
追蹤狀態變化。這可能會讓你發問,pinia
有devtools
嗎?幸運的是,答案是肯定的。Pinia devtools
和我們熟知的Vuex devtool
s 一樣好用,並且一旦我們在程序中使用pinia
, 在開發工具中就能看到它。
4.4 pinia
天然支持typescript
對於vue
開發人員來說,讓vuex
支持類型是很難受的體驗。Pinia
是一個全類型的狀態管理庫,可以解決這個問題。類型安全爲我們的程序帶來了很多好處,例如防止潛在的運行錯誤,但即使我們不使用TypeScript
開發程序,也會獲得其他很多好處,這要感謝Pinia
開發體驗的設計,如自動完成和自動建議。爲了使用這些功能,建議在定義state
時使用箭頭函數,這將獲得最佳的類型推斷。Pinia
對TypeScript
的支持意味着我們可以爲state
設置一個interface
,自動獲取Actions
所需要參數的文檔。例子代碼:
interface ToDoItem {
item: string;
id: number;
done: boolean;
}
export const useTodoStore = defineStore('ToDoStore', {
state: () => ({
todos:[] as ToDoItem[]
}),
actions: {
addTodo(item: string) {
this.todos.push({ item, id: this.id++, done: false })
}
}
})
5. 應該使用pinia
還是vuex
儘管pinia
已經被認定爲vue
官方的狀態管理解決方案,但這並不意味着vuex
已經被棄用了,如果我們生產環境的應用已經使用了vuex
,那麼建議繼續使用vuex
,因爲從一個庫遷移到另一個庫需要大量的工作和時間。但是如果項目還處於早期開發階段,那麼pinia
是個不錯的選擇。
參考:https://www.vuemastery.com/blog/advantages-of-pinia-vs-vuex/
前端很美 每日分享前端乾貨。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/ghmKGQc--YRyuLpNUviKQA