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

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以點此加我微信 ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。


Vue3 發布已經有一段時間了,它采用了新的響應式系統,而且構建了一套全新的 Composition API。Vue 的周邊生態都在加緊適配這套新的系統,官方的狀態管理庫 Vuex 也在適配中,為此官方提出了一個 Vuex 5 的全新提案。

5acffb692717b025516220643d4fe65b.png
  • 支持兩種語法創建 Store:Options ApiComposition Api

  • 刪除 mutations,只支持 stategettersactions

  • 模塊化的設計,能很好支持代碼分割;

  • 沒有嵌套的模塊,只有 Store 的概念;

  • 完整的 TypeScript 支持;

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

d6e4a6683336132e51f5acbdd1f32c68.png

好巧不巧,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?指向👉?statereturn?this.count?*?2},//?如果使用箭頭函數會導致?this?指向有問題//?可以在函數的第一個參數中拿到?statedouble:?(state)?=>?{return?state.count?*?2}},//?actions?用來修改?stateactions:?{increment()?{//?action?中的?this?指向👉?statethis.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。特別是寫代碼的過程中,代碼提示就很不智能。

0a6f2d374f075f4b8819f8a9581d054a.png

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

1bd0de09bbd092b04e951b2d88867b23.png988c7b6128257f139afcaf70f3a83664.png

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

cefbc35033cea58fc9f21b5ae6199999.png

代碼分割

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

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

3995d8a73992542840fd9dd97569517e.pngd95ad7e944f9749b72346724c6e0781c.png

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

ebf8e1b10992786e626fe239859c29eb.png

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

- END -

61c78928b666ba5b8c3e8bcb1a9b1a6a.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助3000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

d8fccdd8b8195b459b70aba180abf411.png

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275089.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275089.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275089.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JS中變量和函數的使用

一、變量的介紹 1、啥是變量? 變量的本質是一塊有名字的內存空間。變量由變量名和變量值構成。變量名指的是內存空間的別名,一般位于賦值運算符的左邊;而變量值指的是內存空間中的數據,一般位于賦值運算符的右邊。例如:var balanc…

Win32 API消息函數:GetMessagePos

Win32 API消息函數:GetMessagePos 函數功能:該函數返回表示屏幕坐標下光標位置的長整數值。此位置表示當上一消息由GetMessage取得時鼠標占用的點。 函數原型:DWORD GetMessagePos(VOID) 參數:無。 返回值&…

都快 2022 年了,這些 Github 使用技巧你都會了嗎?

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。最近經常有小伙伴問我如…

單線程+異步協程

一 . 線程池和進程池 可以適當的使用,在大量的IO情況下有更好的方法 import time from multiprocessing.dummy import Pool def request(url):print(正在下載->,url)time.sleep(2)print(下載完畢->,url) start time.time() urls [www.baidu.com,www.taobao.com,www.sou…

Repeater\DataList\GridView實現分頁,數據編輯與刪除

一、實現效果 1、GridView 2、DataList 3、Repeater 二、代碼 1、可以去Csdn資源下載,包含了Norwind中文示例數據庫噢!(放心下,不要資源分) 下載地址:數據控件示例源碼Norwind中文數據庫 2、我的開發環境&a…

網站快速成型_我的老板對快速成型有什么期望?

網站快速成型Some of the top excuses I have gotten from clients when inviting them into a prototyping session are: “I am not a designer!” “I can’t draw!” “I have no creative background!”在邀請客戶參加原型制作會議時,我從客戶那里得到的一些主…

碎片化學前端,融入到積極上進的環境,我推薦~

眾所周知,關注公眾號可以了解學習掌握技術方向,學習優質好文,落實到自己項目中。還可以結交圈內好友,讓自己融入到積極上進的技術氛圍,促進自己的技術提升。話不多說,推薦這些優質前端公眾號前端之神 80w閱…

重學JavaScript深入理解系列(六)

JavaScript深入理解—-閉包(Closures) 概要 本文將介紹一個在JavaScript經常會拿來討論的話題 —— 閉包(closure)。閉包其實已經是個老生常談的話題了; 有大量文章都介紹過閉包的內容,盡管如此,這里還是要試著從理論角…

EXT.NET復雜布局(四)——系統首頁設計(上)

很久沒有發帖了,很是慚愧,因此給各位使用EXT.NET的朋友獻上一份禮物。 本篇主要講述頁面設計與效果,下篇將講述編碼并提供源碼下載。 系統首頁設計往往是個難點,因為往往要考慮以下因素: 重要通知系統功能菜單快捷操作…

figma設計_在Figma中使用隔片移交設計

figma設計I was quite surprised by how much the design community resonated with the concept of spacers since I published my 自從我發表論文以來,設計界對間隔件的概念產生了多少共鳴,我感到非常驚訝。 last story. It encouraged me to think m…

axios源碼中的10多個工具函數,值得一學~

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。本文來自讀者Ethan01投稿…

安裝jenkins時出現 No such plugin: cloudbees-folder的解決辦法

今天安裝了一下jenkins,在初始化安裝插件時出現“ No such plugin: cloudbees-folder”錯誤,根據網上的教程: 1、打開鏈接“http://ftp.icm.edu.pl/packages/jenkins/plugins/cloudbees-folder/”,在最下面找到并打開“latest”目…

寄充氣娃娃怎么寄_我如何在5小時內寄出新設計作品集

寄充氣娃娃怎么寄Over the Easter break, I challenged myself to set aside an evening rethinking the structure, content and design of my portfolio in Notion with a focus on its 在復活節假期,我挑戰自己,把一個晚上放在一邊,重新思…

基于Hbase的用戶評分協同過濾推薦算法

基于Hbase的用戶評分協同過濾推薦算法 作者: 張保維 2012-1-3 一、 概述 本文為推薦引擎設計的基礎篇,介紹基于hbase 存儲方式用戶評分的方式進行推薦的主體算法及在分布式平臺環境下的實現。由于推薦算法分支眾多,我們先從簡單及實用的算法…

最全 JavaScript Array 方法 詳解

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。我們在日常開發中&#…

[譯] React Hooks: 沒有魔法,只是數組

[譯] React Hooks: 沒有魔法,只是數組 原文鏈接: medium.com/ryardley/r… 我是 React 新特性 Hooks 的粉絲。但是,在你使用 React Hooks的過程中,有一些看上去 很奇怪的限制 。在本文里,對于那些還在為了理解這些限制…

管理溝通中移情的應用_移情在設計中的重要性

管理溝通中移情的應用One of the most important aspects of any great design is the empathetic understanding of and connection to the user. If a design is ‘selfish’, as in when a product designed with the designer in mind and not the user, it will ultimatel…

網易前端進階特訓營,邀你免費入營!一舉解決面試晉升難題!

網易等大廠的前端崗位一直緊缺,特別是資深級。最近一位小哥面進網易,定級P4(資深),總包60W,給大家帶來真實面經要點分享。網易的要求有:1.對性能優化有較好理解,熟悉常用調試工具2.熟…

Feign的構建過程及自定義擴展功能

spring-cloud-openfeign-core-2.1.1.RELEASE.jar 中 HystrixFeign 的詳細構建過程: EnableFeignClients -> FeignClientsRegistrar 掃描 Feign注解的類 -> FeignClientFactoryBean通過Targeter生產FeignClient -> Targeter通過Feign.Builder構建Feign ->…

angelica類似_親愛的當歸(Angelica)是第一個讓我哭泣的VR體驗

angelica類似It was a night just like any other night. I finished work for the day and closed my laptop. I had dinner and after an hour, I put on my Oculus Quest headset in order to begin my VR workout.就像其他任何夜晚一樣, 這 是一個夜晚。 我完成…