真的需要 Pinia 嗎?
最近在想一個問題:在 Vue3 項目中,進行狀態管理的時候,我們真的需要 Pinia 嗎?gnj28資訊網——每日最新資訊28at.com
其實我們可以反過來想一個問題:沒有 Pinia,我們能做狀態管理嗎?gnj28資訊網——每日最新資訊28at.com
答案是:可以!!!gnj28資訊網——每日最新資訊28at.com
ref、reactive
Vue3 的一些 API 對比 React 的好處就是,這些 API 并不一定需要在組件中去聲明。gnj28資訊網——每日最新資訊28at.com
就比如你想要做局部狀態管理的時候,可以直接使用 reactive、ref 這類 API 來完成。gnj28資訊網——每日最新資訊28at.com
圖片gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
圖片gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
圖片gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
這樣能達到局部狀態管理,多組件共用同一個狀態的效果,請看下圖:gnj28資訊網——每日最新資訊28at.com
圖片gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
effectScope
Vue3 有一個超級冷門的 API 叫 effectScope ,這個 API 非常強大,但是很多人都不知道它。gnj28資訊網——每日最新資訊28at.com
當然,既然很少人知道它,那自然就很少人知道,Pinia 的底層原理就是依賴了 effectScope。gnj28資訊網——每日最新資訊28at.com
圖片gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
既然 Pinia 是通過effectScope來實現的,那么,我們自然也可以直接使用這個 API 來做狀態管理!gnj28資訊網——每日最新資訊28at.com
其實已經有人做過這件事了,就比如 vueuse 中的。gnj28資訊網——每日最新資訊28at.com
圖片gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
我們可以直接用這個 Hooks 來進行狀態管理,如果是使用 effectScope 來進行管理的話,狀態就不需要寫在 Hooks 外部了,因為 effectScope 內部邏輯只會執行一次,無論你調用多少次。gnj28資訊網——每日最新資訊28at.com
圖片gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
圖片gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
圖片gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
利用 effectScope 也能達到組件之間共享狀態!gnj28資訊網——每日最新資訊28at.com
圖片gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
那還需要 Pinia 嗎?
結構分明
我覺得 Pinia 還是有他的好處的,好處就是:讓我們少寫一些代碼,并且代碼更加分明。gnj28資訊網——每日最新資訊28at.com
比如下面這個例子:gnj28資訊網——每日最新資訊28at.com
- state: 定義狀態
- getter: 定義計算變量
- action: 定義修改方法
結構很分明:gnj28資訊網——每日最新資訊28at.com
圖片gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
監聽 state
Pinia 還提供了 $subscribe 來監聽整個狀態,我們也可以利用這個方法來做持久化存儲。gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
插件機制
Pinia 提供了插件機制,可以讓你去拓展 Pinia 的功能,以下是你可以擴展的內容:gnj28資訊網——每日最新資訊28at.com
- 為 store 添加新的屬性
- 定義 store 時增加新的選項
- 為 store 增加新的方法
- 包裝現有的方法
- 改變甚至取消 action
- 實現副作用,如本地存儲
- 僅應用插件于特定 store
比如舉個小例子,給所有狀態管理都加一個屬性變量。gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
Pinia 著名的持久化插件pinia-plugin-persistedstate就是利用了 Pinia 的插件機制。gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
gnj28資訊網——每日最新資訊28at.com
他的核心代碼其實很少,就是利用插件機制,使用$subscribe去監聽每一個狀態管理的變化,然后進行持久化存儲!gnj28資訊網——每日最新資訊28at.com
圖片 gnj28資訊網——每日最新資訊28at.com
本文鏈接:http://www.tebozhan.com/showinfo-26-98686-0.html為什么有些 Vue3 項目已經開始棄用 Pinia 了?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 上海啟動未成年人網絡環境整治專項行動:重點整治網絡暴力、網絡語言污染風氣等突出問題
下一篇: 小猿學練機攜最新 AI 大模型應用成果亮相世界人工智能大會