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

vue3學(xué)習(xí)-Pinia狀態(tài)管理

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

Pinia

定義一個(gè)Store

import { defineStore } from 'pinia'
export const useStore = defineStore('main', {})

這個(gè) name,也稱為 id,是必要的,Pinia 使用它來(lái)將 store 連接到 devtools。

將返回的函數(shù)命名為 use… 是跨可組合項(xiàng)的約定,以使其符合你的使用習(xí)慣。

使用 store
import { useStore } from '@/stores/counter'
const storeObj = useStore()
console.log(storeObj.count)

一旦 store 被實(shí)例化,你就可以直接在 store 上訪問(wèn) stategettersactions 中定義的任何屬性

store 是一個(gè)用reactive 包裹的對(duì)象,這意味著不需要在getter 之后寫(xiě).value,

就像setup 中的props 一樣,我們不能對(duì)其進(jìn)行解構(gòu)

為了從 Store 中提取屬性同時(shí)保持其響應(yīng)式,您需要使用storeToRefs()

import { useStore } from '@/stores/counter'
const { count } = useStore()
console.log(count)//失去響應(yīng)

#解決
import { storeToRefs } from 'pinia'
const { count }  = storeToRefs(useStore())
console.log(count.value)

state

在 Pinia 中,狀態(tài)被定義為返回初始狀態(tài)的函數(shù)。

const useStore = defineStore('main', {
    state: () => {
        return {count: 0}
})
訪問(wèn)“state”
const storeObj = useStore()
store.count++
重置狀態(tài)
const storeObj = useStore()
storeObj.$reset()
改變狀態(tài)

可以之惡杰修改: store.count++

可以調(diào)用 $patch 方法

storeObj.$patch({
    otherProp: 'main'//其他屬性
    count: storeObj.count + 1
})

storeObj.$patch((state) => {
    state.item.push({name: 'RenNing', age: 18})
    state.count = ++state.count
})

$patch 方法也接受一個(gè)函數(shù)來(lái)批量修改集合內(nèi)部分對(duì)象的情況

替換state
store.$state = { counter: 666, name: 'Paimon' } //{ counter: 666, name: 'Paimon' }
store.$state = {}

只針對(duì)原定義好的屬性,未定義的數(shù)據(jù)雖然會(huì)添加上,但是不起作用

訂閱狀態(tài)

通過(guò) store 的 $subscribe() 方法查看狀態(tài)及其變化

與常規(guī)的 watch() 相比,使用 $subscribe() 的優(yōu)點(diǎn)是 subscriptions 只會(huì)在 patches 之后觸發(fā)一次

storeObj.$subscribe((mutation, state) => {
  // import { MutationType } from 'pinia'
  mutation.type // 'direct' | 'patch object' | 'patch function'
  // 與 cartStore.$id 相同
  mutation.storeId // 'cart'
  // 僅適用于 mutation.type === 'patch object'
  mutation.payload // 補(bǔ)丁對(duì)象傳遞給 to cartStore.$patch()

  // 每當(dāng)它發(fā)生變化時(shí),將整個(gè)狀態(tài)持久化到本地存儲(chǔ)
  localStorage.setItem('cart', JSON.stringify(state))
})

認(rèn)情況下,state subscriptions 綁定到添加它們的組件

當(dāng)組件被卸載時(shí),它們將被自動(dòng)刪除

如果要在卸載組件后保留它們,請(qǐng)將 { detached: true } 作為第二個(gè)參數(shù)傳遞給 detach 當(dāng)前組件的 state subscription

storeObj.$subscribe(callback, {detached: true})

您可以在 pinia 實(shí)例上查看整個(gè)狀態(tài):

watch(
  pinia.state,
  (state) => {
    // 每當(dāng)它發(fā)生變化時(shí),將整個(gè)狀態(tài)持久化到本地存儲(chǔ)
    localStorage.setItem('piniaState', JSON.stringify(state))
  },
  { deep: true }
)

getter

defineStore() 中的 getters 屬性定義。

接收“狀態(tài)”作為第一個(gè)參數(shù)以鼓勵(lì)箭頭函數(shù)的使用

export const useStore = defineStore('count', {
    state: () =>{{count: 1}},
    getters: {
        //方法一
        doubleCount: (state) => {return state.count * 2},
    	//方法二
        doublePlusOne(): number { return this.counter * 2 + 1 },
    }
})
將參數(shù)傳遞給 getter
# 定義
getters: {
	getUserId(state) =>{
        const arr = state.foo.filter(....)
        return (userId) => arr.find(id => userId == id)
    }
}
#使用
{{getUserId(2)}}

執(zhí)行此操作時(shí),getter 不再緩存,它們只是您調(diào)用的函數(shù)。

但是,您可以在 getter 本身內(nèi)部緩存一些結(jié)果

反問(wèn)其他Store的getter

import {useOtherStore} from './other-sotre'
getters: {
    otherGetter(state) {
        const otherStore = useOtherStore()
        return state.localDate + otherStore.data
    }
}

沒(méi)有setup()

import { mapState } from 'pinia'
computed:{
    ...mapState(useCounterStroe, ['doubleCount'])
}

Actions

相當(dāng)于組件中的methods。適合定義業(yè)務(wù)邏輯

export const useStore = defineStore('main', {
    actions: {
        increment() {this.count++},
        async getApi() {
            try{
                let res = await post('url',options)
            }catch{
                
            }
        }
    },
    
})

與 getters 一樣,操作可以通過(guò) this 訪問(wèn)

actions 可以是異步的

調(diào)用

Actions 像 methods 一樣被調(diào)用:

useStore.getApi()

不適用 setup()

可以使用 mapActions() 將操作屬性映射為組件中的方法

import { mapActions } from 'pinia'
import { getApi } from '../stores/useStore.js'
methods:{
    ...mapActions(getApi)
}

訂閱Actions

使用 store.$onAction() 訂閱 action 及其結(jié)果

const unsubscribe = someStore.$onAction(
  ({
    name, // action 的名字
    store, // store 實(shí)例
    args, // 調(diào)用這個(gè) action 的參數(shù)
    after, // 在這個(gè) action 執(zhí)行完畢之后,執(zhí)行這個(gè)函數(shù)
    onError, // 在這個(gè) action 拋出異常的時(shí)候,執(zhí)行這個(gè)函數(shù)
  }) => {
    // 記錄開(kāi)始的時(shí)間變量
    const startTime = Date.now()
    // 這將在 `store` 上的操作執(zhí)行之前觸發(fā)
    console.log(`Start "${name}" with params [${args.join(', ')}].`)

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

    // 如果 action 拋出或返回 Promise.reject ,onError 將觸發(fā)
    onError((error) => {
      console.warn(
        `Failed "${name}" after ${Date.now() - startTime}ms.\nError: ${error}.`
      )
    })
  }
)

// 手動(dòng)移除訂閱
unsubscribe()

調(diào)用方法時(shí)/后觸發(fā)

默認(rèn)情況下,action subscriptions 綁定到添加它們的組件,默認(rèn)情況下,action subscriptions 綁定到添加它們的組件。

如果要在卸載組件后保留它們,請(qǐng)將 true 作為第二個(gè)參數(shù)傳遞給當(dāng)前組件的 detach action subscription文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-632036.html

// 此訂閱將在組件卸載后保留
someStore.$onAction(callback, true)

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

本文來(lái)自互聯(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)文章

  • 前端開(kāi)發(fā)小技巧 - 【Vue3 + TS】 - 在 TS + Vue3 中使用 Pinia,實(shí)現(xiàn) Pinia 的持久化,優(yōu)化Pinia(倉(cāng)庫(kù)統(tǒng)一管理)

    前端開(kāi)發(fā)小技巧 - 【Vue3 + TS】 - 在 TS + Vue3 中使用 Pinia,實(shí)現(xiàn) Pinia 的持久化,優(yōu)化Pinia(倉(cāng)庫(kù)統(tǒng)一管理)

    ts 中使用 pinia 和 Vue3 基本一致,唯一的不同點(diǎn)在于,需要根據(jù)接口文檔給 state 標(biāo)注類(lèi)型,也要給 actions 標(biāo)注類(lèi)型; 以下都是 組合式API 的寫(xiě)法, 選項(xiàng)式API 的寫(xiě)法大家可以去官網(wǎng)看看; Pinia; 持久化插件 - pinia-plugin-persistedstate; 目標(biāo)文件: src/types/user.d.ts (這里以 user.d.t

    2024年04月09日
    瀏覽(30)
  • Vite4+Typescript+Vue3+Pinia 從零搭建(6) - 狀態(tài)管理pina

    Vite4+Typescript+Vue3+Pinia 從零搭建(6) - 狀態(tài)管理pina

    項(xiàng)目代碼同步至碼云 weiz-vue3-template pina 是 vue3 官方推薦的狀態(tài)管理庫(kù),由 Vue 核心團(tuán)隊(duì)維護(hù),旨在替代 vuex。pina 的更多介紹,可從 pina官網(wǎng) 查看 更簡(jiǎn)潔直接的 API,提供組合式風(fēng)格的 API 支持模塊熱更新和服務(wù)端渲染 對(duì)TS支持更為友好 src目錄下新建store文件夾,并新建index.t

    2024年02月05日
    瀏覽(19)
  • 從零開(kāi)始Vue3+Element Plus后臺(tái)管理系統(tǒng)(六)——狀態(tài)管理Pinia和持久化

    從零開(kāi)始Vue3+Element Plus后臺(tái)管理系統(tǒng)(六)——狀態(tài)管理Pinia和持久化

    官網(wǎng):https://pinia.vuejs.org/zh/ Pinia 是 Vue 的專屬狀態(tài)管理庫(kù),相比Vuex更好用,優(yōu)點(diǎn)不多了說(shuō)官網(wǎng)有,用起來(lái)最重要! 在應(yīng)用的根部注入創(chuàng)建的 pinia 定義store,拿用戶登錄舉個(gè)簡(jiǎn)單例子 在src目錄新建文件夾store,然后新建文件user.ts 在Vue頁(yè)面中使用Pinia 如果我們把登錄用戶的信息

    2024年02月05日
    瀏覽(47)
  • vue3中狀態(tài)管理庫(kù)pinia的安裝和使用方法介紹及和vuex的區(qū)別

    Pinia 與 Vuex 一樣,是作為 Vue 的“狀態(tài)存儲(chǔ)庫(kù)”,用來(lái)實(shí)現(xiàn) 跨頁(yè)面/組件 形式的數(shù)據(jù)狀態(tài)共享。它允許你跨組件或頁(yè)面共享狀態(tài)。如果你熟悉組合式 API 的話,你可能會(huì)認(rèn)為可以通過(guò)一行簡(jiǎn)單的 export const state = reactive({}) 來(lái)共享一個(gè)全局狀態(tài)。 當(dāng)該數(shù)據(jù)、方法在很多地方都需要

    2024年01月20日
    瀏覽(21)
  • Vite-Admin后臺(tái)管理系統(tǒng)|vite4+vue3+pinia前端后臺(tái)框架實(shí)例

    Vite-Admin后臺(tái)管理系統(tǒng)|vite4+vue3+pinia前端后臺(tái)框架實(shí)例

    基于 vite4.x+vue3+pinia 前端后臺(tái)管理系統(tǒng)解決方案 ViteAdmin 。 前段時(shí)間分享了一篇vue3自研pc端UI組件庫(kù)VEPlus。這次帶來(lái)最新開(kāi)發(fā)的基于 vite4+vue3+pinia 技術(shù)棧搭配ve-plus組件庫(kù)構(gòu)建的中后臺(tái)權(quán)限管理系統(tǒng)框架。 支持vue-i18n國(guó)際化多語(yǔ)言、動(dòng)態(tài)路由鑒權(quán)、4種布局模板及tab頁(yè)面緩存 等功

    2023年04月13日
    瀏覽(25)
  • Vue狀態(tài)管理庫(kù)-Pinia

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

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

    2024年02月22日
    瀏覽(29)
  • Vue——狀態(tài)管理庫(kù)Pinia

    Vue——狀態(tài)管理庫(kù)Pinia

    寫(xiě)在前面 :本文參考小滿大牛的pinia專欄 Vuex 和 Pinia 均是 Vue.js 的狀態(tài)管理庫(kù),它們?yōu)?Vue 應(yīng)用程序提供了一種集中式的、可預(yù)測(cè)的狀態(tài)管理解決方案。 Vuex 是 Vue.js 官方推薦的狀態(tài)管理庫(kù)之一。它的核心概念包括 state、mutation、action 和 getter。其中,state 代表應(yīng)用程序的狀態(tài)

    2024年02月07日
    瀏覽(23)
  • Vue最新?tīng)顟B(tài)管理工具Pinia——徹底搞懂Pinia是什么

    Vue最新?tīng)顟B(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í)過(guò)程 中,接觸了與 狀態(tài)管理 相關(guān)的內(nèi)容,涉及到 與vue2適配的vuex 和 與vue3適配的pinia ,因此

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

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

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

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

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

    2023年04月09日
    瀏覽(101)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包