国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue:狀態(tài)管理庫及其部分原理(Vuex、Pinia)

這篇具有很好參考價(jià)值的文章主要介紹了vue:狀態(tài)管理庫及其部分原理(Vuex、Pinia)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、為什么要用狀態(tài)管理庫?

多組件的狀態(tài)共享問題: 當(dāng)多個(gè)組件需要訪問和修改相同的數(shù)據(jù)時(shí),我們需要在組件之間傳遞 props或者使用事件總線。當(dāng),應(yīng)用就會(huì)變得難以維護(hù)和調(diào)試。

多組件狀態(tài)同步問題: 當(dāng)一個(gè)組件修改了狀態(tài),其他組件可能無法立即得知該變化。

狀態(tài)變更的追蹤問題: 無法追蹤到狀態(tài)的變化是由何處引起的,使得調(diào)試和維護(hù)變得困難。

2、Vuex

2.1、核心概念

2.1.1、State:用于存儲(chǔ)應(yīng)用程序的狀態(tài)數(shù)據(jù)

當(dāng)你需要在多個(gè)組件之間共享數(shù)據(jù)時(shí),可以將這些數(shù)據(jù)放入state中。

例如,保存用戶登錄狀態(tài)、購(gòu)物車中的商品列表等。

可以通過在組件中使用store.state.xxx或計(jì)算屬性來獲取狀態(tài)數(shù)據(jù)。

2.1.2、Mutation:用于修改狀態(tài)的方法,必須是同步函數(shù)。

什么時(shí)候用? 當(dāng)你需要修改狀態(tài)時(shí)。讓所有的狀態(tài)變更都經(jīng)過 mutation可以保證狀態(tài)的變更是可追蹤的。

通常,一個(gè) mutation 對(duì)應(yīng)一個(gè)狀態(tài)變更操作。例如,修改用戶登錄狀態(tài)、添加商品到購(gòu)物車等。

2.1.3、Action:用于處理異步邏輯或提交多個(gè) mutation。

什么時(shí)候用? 當(dāng)你需要處理異步操作(例如發(fā)起網(wǎng)絡(luò)請(qǐng)求)或需要在一個(gè) action 中提交多個(gè) mutation 時(shí)。

Action 可以包含任意的異步操作,并可以通過提交 mutation 來修改狀態(tài)。

例如,獲取用戶信息的異步請(qǐng)求、添加多個(gè)商品到購(gòu)物車等。

2.1.4、Getter:用于從狀態(tài)中獲取派生數(shù)據(jù)的方法。

什么時(shí)候用? 當(dāng)你需要根據(jù)狀態(tài)state.xxx計(jì)算出一些數(shù)據(jù)時(shí)。

Getter 可以將一些復(fù)雜的數(shù)據(jù)計(jì)算邏輯封裝起來,并在組件中使用 store.getters 來獲取計(jì)算后的數(shù)據(jù)。

例如,基于購(gòu)物車商品列表計(jì)算購(gòu)物車總價(jià)、根據(jù)用戶權(quán)限判斷是否具有管理員角色等。

2.2、原理(v4.0.2)

2.2.1、vuex如何掛載到vue實(shí)例的

install (app, injectKey) {
  // 使用`vue.provide()`將`vuex`提供給整個(gè)應(yīng)用
  app.provide(injectKey || storeKey, this)
  // 將vuex實(shí)例賦值給vue.$store;
  // 在項(xiàng)目的非setup中可以使用this.$store.state.xxx取值就是這樣來的
  app.config.globalProperties.$store = this
}

2.2.2、useStore 源碼

import { inject } from 'vue'

export const storeKey = 'store'

export function useStore (key = null) {
  return inject(key !== null ? key : storeKey)
}

commit源碼

  commit (_type, _payload, _options) {
    const { type, payload, options } = unifyObjectStyle(_type, _payload, _options)

    const mutation = { type, payload }
    // 查找該類型對(duì)應(yīng)的 mutations
    const entry = this._mutations[type]
    if (!entry) {
      return
    }
    // 執(zhí)行mutations對(duì)應(yīng)的處理函數(shù)
    this._withCommit(() => {
      entry.forEach(function commitIterator (handler) {
        handler(payload)
      })
    })

    // 通知訂閱者
    this._subscribers
      .slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe
      .forEach(sub => sub(mutation, this.state))
  }

3、Pinia

相比vuex的優(yōu)勢(shì):

  • 可通過devtools追蹤數(shù)據(jù)變化,無需通過commit提交Mutation
  • 支持TS,提供代碼自動(dòng)補(bǔ)全,源碼為TS編寫;vuex是用JS編寫的,vuex要支持TS需要安裝插件
  • pinia更輕,大小只有 1kb 左右

改變狀態(tài)的方法

  • 直接修改變量
  • 調(diào)用action
  • 調(diào)用patch

3.1原理

install 原理與vuex一致

  	let toBeInstalled: PiniaPlugin[] = []
    install(app: App) {
      if (!isVue2) {
        pinia._a = app
        // 暴露pinia,組件通過inject注入pinia實(shí)例
        app.provide(piniaSymbol, pinia)
        // 模版中可通過$pinia訪問
        app.config.globalProperties.$pinia = pinia
        // 將pinia的plugin 存到插件列表
        toBeInstalled.forEach((plugin) => _p.push(plugin))
        toBeInstalled = []
      }
    },

pinia的plugin實(shí)現(xiàn)原理
1、在調(diào)用vue.use(pinia)之前注入插件的情況,會(huì)將plugin存放到toBeInstalled列表,
2、調(diào)用vue.use(pinia)之后,會(huì)將toBeInstalled的插件存到pinia實(shí)例的_p中
3、調(diào)用useStore時(shí)將plugin注入每個(gè)Store實(shí)例文章來源地址http://www.zghlxwxcb.cn/news/detail-805212.html

    pinia.use(plugin) {
      if (!this._a && !isVue2) {
        toBeInstalled.push(plugin)
      } else {
        _p.push(plugin)
      }
      return this
    }
useStore(pinia) {
 if (!pinia._s.has(id)) {
      // creating the store registers it in `pinia._s`
      if (isSetupStore) {
        createSetupStore(id, setup, options, pinia)
      } else {
        createOptionsStore(id, options as any, pinia)
      }

      /* istanbul ignore else */
      if (__DEV__) {
        // @ts-expect-error: not the right inferred type
        useStore._pinia = pinia
      }
    }
}
createSetupStore () {
	pinia._p.forEach((extender) => {
		assign(
        store,
        scope.run(() =>
          extender({
            store: store as Store,
            app: pinia._a,
            pinia,
            options: optionsForPlugin,
          })
        )!
      )
	}}

到了這里,關(guān)于vue:狀態(tài)管理庫及其部分原理(Vuex、Pinia)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Vue狀態(tài)管理庫-Pinia

    Vue狀態(tài)管理庫-Pinia

    Pinia 是 Vue 的專屬狀態(tài)管理庫,它允許支持跨組件或頁面共享狀態(tài),即共享數(shù)據(jù),他的初始設(shè)計(jì)目的是設(shè)計(jì)一個(gè)支持組合式API的 Vue 狀態(tài)管理庫(因?yàn)関ue3一個(gè)很大的改變就是組合式API),當(dāng)然這并不是說Pinia只支持vue3,他是同時(shí)支持vue2和vue3的, 本文傾向于擁抱Vue3,所以代碼語

    2024年02月22日
    瀏覽(30)
  • 【Vue】使用 Vuex 作為狀態(tài)管理

    【Vue】使用 Vuex 作為狀態(tài)管理

    Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式和庫。它使用單一狀態(tài)樹,這意味著這個(gè)對(duì)象包含了全部的應(yīng)用層級(jí)狀態(tài),并且以一種相對(duì)集中的方式存在。這也意味著,通常單個(gè)項(xiàng)目中只有一個(gè) Vuex store。Vuex 的核心概念和功能包括: 狀態(tài)(State) :Vuex 使用單一狀態(tài)樹

    2024年01月23日
    瀏覽(24)
  • Vue使用 Pinia 進(jìn)行狀態(tài)管理

    Pinia 是一個(gè)適用于 Vue.js 的狀態(tài)管理庫,它采用了組合式 API 的理念,使得狀態(tài)管理變得更加簡(jiǎn)單、直觀和靈活。與傳統(tǒng)的 Vuex 相比,Pinia 提供了更好的 TypeScript 支持,同時(shí)也更加適合大型應(yīng)用程序和復(fù)雜狀態(tài)邏輯的管理。 首先,我們需要在 Vue 項(xiàng)目中安裝 Pinia。你可以通過

    2024年02月13日
    瀏覽(37)
  • 【Vue全家桶】Pinia狀態(tài)管理

    【Vue全家桶】Pinia狀態(tài)管理

    ??這里是前端程序員小張! ??人海茫茫,感謝這一秒你看到這里。希望我的文章對(duì)你的有所幫助! ??愿你在未來的日子,保持熱愛,奔赴山海! Pinia開始于大概2019年,其目的是設(shè)計(jì)一個(gè)擁有 組合式 API 的 Vue 狀態(tài)管理庫 目前同時(shí)兼容Vue2、Vue3,也并不要求你使用Compositio

    2023年04月09日
    瀏覽(104)
  • Vue--》探索Pinia:Vue狀態(tài)管理的未來

    Vue--》探索Pinia:Vue狀態(tài)管理的未來

    目錄 Pinia的講解與使用 Pinia的安裝與使用 store數(shù)據(jù)操作 解構(gòu)store數(shù)據(jù)

    2024年02月05日
    瀏覽(19)
  • vue3學(xué)習(xí)-Pinia狀態(tài)管理

    定義一個(gè)Store 這個(gè) name ,也稱為 id ,是必要的,Pinia 使用它來將 store 連接到 devtools。 將返回的函數(shù)命名為 use… 是跨可組合項(xiàng)的約定,以使其符合你的使用習(xí)慣。 使用 store 一旦 store 被實(shí)例化,你就可以直接在 store 上訪問 state 、 getters 和 actions 中定義的任何屬性 store 是一

    2024年02月14日
    瀏覽(17)
  • Vue最新狀態(tài)管理工具Pinia——徹底搞懂Pinia是什么

    Vue最新狀態(tài)管理工具Pinia——徹底搞懂Pinia是什么

    知識(shí)專欄 專欄鏈接 Vuex知識(shí)專欄 https://blog.csdn.net/xsl_hr/category_12158336.html?spm=1001.2014.3001.5482 Vuex官方文檔 https://vuex.vuejs.org/zh/ Pinia官方文檔 https://pinia.web3doc.top/ 最近在 前端的深入學(xué)習(xí)過程 中,接觸了與 狀態(tài)管理 相關(guān)的內(nèi)容,涉及到 與vue2適配的vuex 和 與vue3適配的pinia ,因此

    2024年02月03日
    瀏覽(53)
  • vue3 快速入門系列 —— 狀態(tài)管理 pinia

    vue3 快速入門系列 —— 狀態(tài)管理 pinia

    其他章節(jié)請(qǐng)看: vue3 快速入門 系列 vue3 狀態(tài)管理這里選擇 pinia。 雖然 vuex4 已支持 Vue 3 的 Composition API,但是 vue3 官網(wǎng)推薦新的應(yīng)用使用 pinia —— vue3 pinia redux、mobx、vuex、pinia都是集中式狀態(tài)管理工具。與之對(duì)應(yīng)的就是分布式。 Pinia 符合直覺 的 Vue.js 狀態(tài)管理庫 甚至讓你忘

    2024年04月26日
    瀏覽(16)
  • vue 全局狀態(tài)管理(簡(jiǎn)單的store模式、使用Pinia)

    vue 全局狀態(tài)管理(簡(jiǎn)單的store模式、使用Pinia)

    多個(gè)組件可能會(huì)依賴同一個(gè)狀態(tài)時(shí),我們有必要抽取出組件內(nèi)的共同狀態(tài)集中統(tǒng)一管理,存放在一個(gè)全局單例中,這樣任何位置上的組件都可以訪問其中的狀態(tài)或觸發(fā)動(dòng)作 通過自定義一個(gè)store模式實(shí)現(xiàn)全局的狀態(tài)管理,實(shí)例如下 有兩個(gè)組件a、b共享store和store2兩個(gè)狀態(tài),我們

    2024年02月13日
    瀏覽(21)
  • 深入 Pinia:從代碼出發(fā)探索 Vue 狀態(tài)管理的奧秘

    深入 Pinia:從代碼出發(fā)探索 Vue 狀態(tài)管理的奧秘

    ?? 項(xiàng)目地址:https://github.com/mk965/read-pinia ??????? 本節(jié)代碼:https://github.com/mk965/read-pinia/tree/article_1 ??源碼地址: github.com/vuejs/pinia ??打包文件: rollup.config.js ??入口文件: packages/pinia/src/index.ts 將 pinia/packages/pinia/src 目錄下的所有文件復(fù)制到我們之前生成項(xiàng)目的 /src

    2023年04月25日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包