Vue-Pinia簡記

簡介

Pinia是Vuex的升級版逛尚,使用比Vuex更加簡單方便,同時支持Vue2.x和Vue3.x。Pinia是Vue的專屬狀態(tài)管理庫雪猪,它允許你跨組件和頁面共享狀態(tài)。簡單理解就是如果你有需要全組件都要共享訪問和操作的數(shù)據(jù)起愈,那么就用Pinia只恨。

使用入門

安裝包

npm install pinia

配置

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

const pinia = createPinia()
const app = createApp(App)

app.use(pinia)
app.mount('#app')

以上是適用于Vue3的译仗,如果是Vue2還需要安裝一個插件,并在應(yīng)用的根部注入創(chuàng)建的pinia

import {defineStore} from 'pinia'

/**
 * 定義并到處容器
 * 參數(shù)1:容器的ID官觅,必須唯一纵菌,將來Pinia會把所有的容器掛載到根容器
 * 參數(shù)2:選項對象
 * 返回值:一個函數(shù),調(diào)用得到容器實例
 */
export const useCounterStore = defineStore('counter',{
    /**
     * 類似于組件的data休涤,用來存儲全局狀態(tài)的
     * 1咱圆、必須是函數(shù):這樣是為了服務(wù)端渲染的時候避免交叉請求導致數(shù)據(jù)狀態(tài)的污染
     * 2、必須是箭頭函數(shù)功氨,為了更好的TS類型推導
     */
    state:() => {
        return {
            count:0
        }
    },

    /**
     * 類似于組件的computed序苏,用來封裝計算屬性,有緩存的功能
     */
    getters:{
        double:(state) => state.count * 2
    },

    /**
     * 類似于組件的methods捷凄,封裝業(yè)務(wù)邏輯忱详,修改state
     */
    actions:{
        increment(){
            this.count++
        }
    }
})

以上是展示的Option Store方式創(chuàng)建Store,還有一種就和setup函數(shù)類似的Setup Store創(chuàng)建方式:

坑點

  • 不要直接解構(gòu)state跺涤,因為state原理就是使用reactive進行封裝匈睁,所以reactive有的缺點它也有(比如解構(gòu)后失去響應(yīng)性)。如果先使用解構(gòu)方式訪問桶错,Pinia提供了storeToRefs()
  • 不能在 actions中定義箭頭函數(shù)软舌,this的指向會混亂。
  • getterscomputed類似牛曹,對數(shù)據(jù)會有緩存佛点,沒有改變時多次調(diào)用都會調(diào)用緩存的數(shù)據(jù)。

使用

  • state的基本使用
<script setup>
import { useCounterStore } from "../../store/index";

const mainstore = useCounterStore()


const handleChangeState = () => {
    //方式一黎比,最簡單的方式
    mainstore.count++
    //方式二超营,需要修改多個數(shù)據(jù),建議使用$patch 批量更新(內(nèi)部有性能優(yōu)化)
    mainstore.$patch({
        count: mainstore.count + 1,
        message:'changed info',
        arr:[...mainstore.arr,66]
    })
    //方式三:$patch一個函數(shù),更好的批量更新方式
    mainstore.$patch(state => {
        state.count++
        state.message = 'info3'
        state.arr.push(99)
    })
}
</script>

以上方法都可以放到actions中做處理,同樣可以通過this.$patch的方式批量操作狀態(tài)

  • getters的使用
  • actions的使用

類似getters阅虫,不同的是演闭,action可以是異步的,可以在里面await調(diào)用任何API颓帝,以及其他的action米碰。

訪問其他store上的action

  • 訂閱Action(store.$onAction()

可以通過store.$Action()來監(jiān)聽action和它們的結(jié)果。傳遞給它的回調(diào)函數(shù)會在action本身之前執(zhí)行购城。
after表示在promise解決之后吕座,允許你在action解決后執(zhí)行一個回調(diào)函數(shù)。
onError允許你在action拋出錯誤或reject時執(zhí)行一個回調(diào)函數(shù)瘪板。
這些函數(shù)對于追蹤運行時錯誤非常有用吴趴。

const unsubscribe = someStore.$onAction(
  ({
    name, // action 名稱
    store, // store 實例,類似 `someStore`
    args, // 傳遞給 action 的參數(shù)數(shù)組
    after, // 在 action 返回或解決后的鉤子
    onError, // action 拋出或拒絕的鉤子
  }) => {
    // 為這個特定的 action 調(diào)用提供一個共享變量
    const startTime = Date.now()
    // 這將在執(zhí)行 "store "的 action 之前觸發(fā)侮攀。
    console.log(`Start "${name}" with params [${args.join(', ')}].`)

    // 這將在 action 成功并完全運行后觸發(fā)锣枝。
    // 它等待著任何返回的 promise
    after((result) => {
      console.log(
        `Finished "${name}" after ${
          Date.now() - startTime
        }ms.\nResult: ${result}.`
      )
    })

    // 如果 action 拋出或返回一個拒絕的 promise厢拭,這將觸發(fā)
    onError((error) => {
      console.warn(
        `Failed "${name}" after ${Date.now() - startTime}ms.\nError: ${error}.`
      )
    })
  }
)

// 手動刪除監(jiān)聽器
unsubscribe()

默認情況下,action訂閱器會被綁定到添加它們的組件上(如果store在組件的setup()內(nèi))撇叁。這意味著供鸠,當組件被卸載時,它們將被自動刪除陨闹。如果你想在組件卸載時依舊保留它們回季,就將true作為第二個參數(shù)傳遞給action訂閱器,以便將其從當前組件中分離:

<script setup>
const someStore = useSomeStore()
// 此訂閱器即便在組件卸載之后仍會被保留
someStore.$onAction(callback, true)
</script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末正林,一起剝皮案震驚了整個濱河市泡一,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌觅廓,老刑警劉巖鼻忠,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杈绸,居然都是意外死亡帖蔓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門瞳脓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塑娇,“玉大人,你說我怎么就攤上這事劫侧÷癯辏” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵烧栋,是天一觀的道長写妥。 經(jīng)常有香客問我,道長审姓,這世上最難降的妖魔是什么珍特? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮魔吐,結(jié)果婚禮上扎筒,老公的妹妹穿的比我還像新娘。我一直安慰自己酬姆,他們只是感情好嗜桌,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著轴踱,像睡著了一般症脂。 火紅的嫁衣襯著肌膚如雪谚赎。 梳的紋絲不亂的頭發(fā)上淫僻,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天诱篷,我揣著相機與錄音,去河邊找鬼雳灵。 笑死棕所,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的悯辙。 我是一名探鬼主播琳省,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼躲撰!你這毒婦竟也來了针贬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拢蛋,失蹤者是張志新(化名)和其女友劉穎桦他,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谆棱,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡快压,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垃瞧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔫劣。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖个从,靈堂內(nèi)的尸體忽然破棺而出脉幢,到底是詐尸還是另有隱情,我是刑警寧澤嗦锐,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布鸵隧,位于F島的核電站,受9級特大地震影響意推,放射性物質(zhì)發(fā)生泄漏豆瘫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一菊值、第九天 我趴在偏房一處隱蔽的房頂上張望外驱。 院中可真熱鬧,春花似錦腻窒、人聲如沸昵宇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓦哎。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒋譬,已是汗流浹背割岛。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犯助,地道東北人癣漆。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像剂买,于是被迫代替她去往敵國和親惠爽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容