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

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

這篇具有很好參考價(jià)值的文章主要介紹了vue3 快速入門系列 —— 狀態(tài)管理 pinia。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

其他章節(jié)請看:

vue3 快速入門 系列文章來源地址http://www.zghlxwxcb.cn/news/detail-859117.html

pinia

vue3 狀態(tài)管理這里選擇 pinia。

雖然 vuex4 已支持 Vue 3 的 Composition API,但是 vue3 官網(wǎng)推薦新的應(yīng)用使用 pinia —— vue3 pinia

集中式狀態(tài)管理

redux、mobx、vuex、pinia都是集中式狀態(tài)管理工具。與之對應(yīng)的就是分布式。

Pinia 符合直覺的 Vue.js 狀態(tài)管理庫 甚至讓你忘記正在使用的是一個(gè)狀態(tài)庫 —— 官網(wǎng)

安裝 pinia 環(huán)境

首先下載安裝包:

PS hello_vue3> npm i pinia

added 2 packages, and audited 71 packages in 11s

10 packages are looking for funding
  run `npm fund` for details

1 moderate severity vulnerability

To address all issues, run:      
  npm audit fix

Run `npm audit` for details.  
 "dependencies": {
    "pinia": "^2.1.7",
    "vue": "^3.4.15",
    "vue-router": "^4.3.0"
  },

在 main.ts 中依次:引入、創(chuàng)建和安裝 pinia,在瀏覽器 vue 開發(fā)者工具中就能看到 pinia(一個(gè)菠蘿圖標(biāo))。

import {createApp} from 'vue'
import App from './App.vue'
import router from './router'

// 引入
import { createPinia } from 'pinia'

const app = createApp(App)

// 創(chuàng)建
const pinia = createPinia()
app.use(router)

// 安裝:就像安裝 vue-router 一樣使用
app.use(pinia)
app.mount('#app')

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

有時(shí)這個(gè)菠蘿沒出現(xiàn),可以關(guān)閉瀏覽器或重啟服務(wù)。

Tip: 詳細(xì)請看 pinia 安裝官網(wǎng)

第一個(gè)示例

vuex 的核心概念有 State、Getters、Mutations、Actions和Modules。其中 State 是數(shù)據(jù),我們不能直接修改數(shù)據(jù)。

pinia 比 vuex 更輕量,更易使用。比如拿到數(shù)據(jù)后就能直接改,符合直覺。

請看示例:

pinia 的數(shù)據(jù)從項(xiàng)目目錄上說,會放在 store 文件夾中。

通常我們會對狀態(tài)進(jìn)行分類,比如用戶相關(guān)的數(shù)據(jù)放在 store/user.ts 中:

// src/store/user.ts
import { defineStore } from 'pinia'

// 你可以任意命名 `defineStore()` 的返回值,但最好使用 store 的名字,同時(shí)以 `use` 開頭且以 `Store` 結(jié)尾。
// (比如 `useUserStore`,`useCartStore`,`useProductStore`)
// 第一個(gè)參數(shù)是你的應(yīng)用中 Store 的唯一 ID。 Pinia 將用它來連接 store 和 devtools
export const useUserStore = defineStore('user', {
  // actions 里面放一個(gè)一個(gè)的方法,用于響應(yīng)組件中的動作
  actions: {
    changeNameAndAge() {
      // this Proxy(Object)
      // 里面有 $state。在 vue2 中有 $watch、$on等以$開頭的都是給程序員用的實(shí)例方法
      console.log('this', this);
      
      // 沒必要通過 $state,直接訪問即可
      this.name += '~'
      this.$state.age += 1
    }
  },
  state: () => {
    return {
      name: 'peng',
      age: 18,
    }
  },
})

通過 defineStore 定義一個(gè) store,第一個(gè)參數(shù)是 store 的id,命名建議規(guī)范,例如使用文件名,導(dǎo)出方式這里選擇分別導(dǎo)出,導(dǎo)出的名字使用 use+user+store。

state 是一個(gè)函數(shù),返回的就是數(shù)據(jù)

actions 中是一個(gè)一個(gè)的方法,但不需要像 vuex 中需用 dispatch 觸發(fā)。

接著在需要使用狀態(tài)的地方使用。讀取狀態(tài)的方式有2種,修改狀態(tài)的方式有3種:

// Home.vue
<template>
  <div>
    <!-- 讀取方式1 -->
    <p>{{ userStore.name }}</p>
    <!-- 讀取方式2。方式1更方便 -->
    <p>{{ userStore.$state.age }}</p>

    <p><button @click="changeNameAndAge">修改方式1:change age and name</button></p>
    <p><button @click="changeNameAndAge2">修改方式2:change age and name</button></p>
    <p><button @click="changeNameAndAge3">修改方式3:change age and name</button></p>
  </div>
</template>

<script lang="ts" setup name="App">
// 寫 '@/store/user.ts' vscode 報(bào)錯(cuò):An import path can only end with a '.ts' extension when 'allowImportingTsExtensions' is enabled
// 去掉 .ts 即可
import {useUserStore} from '@/store/user'

const userStore = useUserStore()
// userStore: Proxy(Object)
console.log('userStore: ', userStore);

function changeName() {
  // 修改數(shù)據(jù)方式1:直接操作數(shù)據(jù)
  // vue2中的vuex必須通過mutation更新數(shù)據(jù),不能直接修改數(shù)據(jù)
  userStore.name += '~'
}

function changeNameAndAge() {
  userStore.$state.name += '~'
  userStore.$state.age += 1
}

function changeNameAndAge2() {
  // $patch 用于批量修改
  // patch 中文“碎片”,比如age 就是 pinia 中一個(gè)數(shù)據(jù)碎片
  userStore.$patch({
    name: userStore.name + '~',
    age: userStore.age + 1
  })
}

function changeNameAndAge3() {
  // 調(diào)用 actions
  userStore.changeNameAndAge()
}
</script>

Tip: changeNameAndAge 會觸發(fā)兩次修改,而 changeNameAndAge2 使用 $patch 會進(jìn)行批量修改,從開發(fā)者時(shí)間線中看到,只執(zhí)行一次。如果很多數(shù)據(jù)同時(shí)修改,推薦使用 patch。

優(yōu)雅的讀取數(shù)據(jù)

前面我們是這么讀取 store 中數(shù)據(jù):

<p>{{ userStore.name }}</p>

const userStore = useUserStore()

如果需要讀取的數(shù)據(jù)太多,在模板中就會出現(xiàn)很多 userStore,于是我們想到用 toRefs 解構(gòu)解決。就像這樣:

<p>優(yōu)雅的讀:{{ name }}</p>

import {toRefs} from 'vue'
const userStore = useUserStore()
const {name} = toRefs(userStore)

但是 toRefs(userStore) 太重,通過console.log(toRefs(userStore)) 你會發(fā)現(xiàn)toRefs將 store 所有屬性(包括方法)都轉(zhuǎn)成 ref,其實(shí)我們只需要將數(shù)據(jù)轉(zhuǎn)成 ref 即可。

pinia 也想到了這個(gè)問題,于是可以用 storeToRefs 替代。就像這樣:

<p>優(yōu)雅的讀:{{ name }}</p>

import {storeToRefs} from 'pinia'
const userStore = useUserStore()

const {name} = storeToRefs(userStore)

// storeToRefs(userStore): {name: ObjectRefImpl, age: ObjectRefImpl}
console.log('storeToRefs(userStore): ', storeToRefs(userStore));

// toRefs(userStore): {$id: ObjectRefImpl, $onAction: ObjectRefImpl, $patch: ObjectRefImpl, $reset: ObjectRefImpl, $subscribe: ObjectRefImpl, …}
console.log('toRefs(userStore): ', toRefs(userStore));

Getters

和 vuex 中 Getters 作用相同,用法類似。

這里用了兩種方式定義 getters:

  state: () => {
    return {
      name: 'Peng',
      age: 18,
    }
  },
  getters: {
    // 推薦使用箭頭函數(shù),參數(shù)會傳入 state
    bigName: (state) => state.name.toLocaleUpperCase(),

    // 如果需要訪問其他 getters 屬性,可以通過非箭頭函數(shù),通過 this 訪問
    lowerName2(): string{
      return this.bigName.toLocaleLowerCase()
    }
  },

數(shù)據(jù)取得的方式和 state 相同:

<p>優(yōu)雅的讀:{{ name }}</p>
<p>bigName:{{ bigName }}</p>
<p>lowerName2:{{ lowerName2 }}</p>

const userStore = useUserStore()

const {name, bigName, lowerName2} = storeToRefs(userStore)

Tip:詳細(xì)請看 pinia getters

訂閱

類似于 Vuex 的 subscribe 方法,你可以通過 store 的 $subscribe() 方法偵聽 state 及其變化

只要 userStore 中的數(shù)據(jù)變化了,函數(shù)就會被調(diào)用,我們通常關(guān)心第二個(gè)參數(shù):

// 只要 userStore 數(shù)據(jù)變化,這個(gè)
userStore.$subscribe((mutation, state) => {
  // {storeId: 'user', type: 'direct', events: {…}}
  console.log('mutation: ', mutation);

  // Proxy(Object)?{name: 'Peng~', age: 19}
  console.log('state: ', state);

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

我們可以將 state 存儲到本地,這樣就可以實(shí)現(xiàn)頁面刷新,狀態(tài)不丟失。

Tip: 細(xì)節(jié)請看 訂閱 state。

組合式寫法

目前 actions state 寫法屬于聲明式的:

import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  actions: {
    changeNameAndAge() {
      this.name += '~'
      this.$state.age += 1
    }
  },
  state: () => {
    return {
      name: 'Peng',
      age: 18,
    }
  },
  getters: {
    bigName: (state) => state.name.toLocaleUpperCase(),
    lowerName2(): string{
      return this.bigName.toLocaleLowerCase()
    }
  },
})

將其改成組合式。代碼如下:

import { defineStore } from 'pinia';
import {ref, computed} from 'vue'
export const useUserStore = defineStore('user', () => {
  // 數(shù)據(jù)用 ref 或 reactive 定義
  const name = ref('Peng')
  const age = ref(18)
  
  // getters 用計(jì)算屬性
  const bigName = computed(() => name.value.toLocaleUpperCase())
  const lowerName2 = computed(() => bigName.value.toLocaleLowerCase())

  // actions 用方法定義
  function changeNameAndAge() {
    name.value += '~';
    age.value += 1;
  }

  // 最后必須暴露出去
  return {
    // vscode 中數(shù)據(jù)一個(gè)顏色、方法另一個(gè)顏色
    name,
    age,
    bigName,
    lowerName2,
    changeNameAndAge,
  };
});

Tip:組合式寫法更靈活(請看 組合式 Store),層級少,但必須返回。具體如何選擇自行決定。

擴(kuò)展

ref 數(shù)據(jù)要不要 .value

const a = reactive({
    x: 1,
    y: 2,
    z: ref(3)
})

const b = ref(4)
console.log(a.x)
// ref 如果在里面,則不需要拆包
console.log(a.z)
console.log(b.value)

讀取響應(yīng)式對象中的 ref 不需要 .value

其他章節(jié)請看:

vue3 快速入門 系列

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

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

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

相關(guān)文章

  • vue2(Vuex)、vue3(Pinia)、react(Redux)狀態(tài)管理

    vue2(Vuex)、vue3(Pinia)、react(Redux)狀態(tài)管理

    Vuex 是一個(gè)專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式。它使用集中式存儲管理應(yīng)用的所有組件的狀態(tài),以及規(guī)則保證狀態(tài)只能按照規(guī)定的方式進(jìn)行修改。 State(狀態(tài)) :Vuex 使用單一狀態(tài)樹,即一個(gè)對象包含全部的應(yīng)用層級狀態(tài)。這個(gè)狀態(tài)樹對應(yīng)著一個(gè)應(yīng)用中的所有狀態(tài)。 Gett

    2024年01月23日
    瀏覽(27)
  • 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)管理庫,由 Vue 核心團(tuán)隊(duì)維護(hù),旨在替代 vuex。pina 的更多介紹,可從 pina官網(wǎng) 查看 更簡潔直接的 API,提供組合式風(fēng)格的 API 支持模塊熱更新和服務(wù)端渲染 對TS支持更為友好 src目錄下新建store文件夾,并新建index.t

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

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

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

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

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

    2024年01月20日
    瀏覽(23)
  • vue3 快速入門系列 —— vue3 路由

    vue3 快速入門系列 —— vue3 路由

    在vue3 基礎(chǔ)上加入路由。 vue3 需要使用 vue-router V4 ,相對于 v3,大部分的 Vue Router API 都沒有變化。 Tip :不了解路由的同學(xué)可以看一下筆者之前的文章:vue2 路由 參考:vue2 路由官網(wǎng)、vue3 路由官網(wǎng) 在 Vue Router API 從 v3(Vue2)到 v4(Vue3)的重寫過程中,大部分的 Vue Router API 都

    2024年04月09日
    瀏覽(20)
  • vue3 快速入門系列 —— 基礎(chǔ)

    vue3 快速入門系列 —— 基礎(chǔ)

    前面我們已經(jīng)用 vue2 和 react 做過開發(fā)了。 從 vue2 升級到 vue3 成本較大,特別是較大的項(xiàng)目。所以許多公司對舊項(xiàng)目繼續(xù)使用vue2,新項(xiàng)目則使用 vue3。 有些UI框架,比如ant design vue1.x 使用的 vue2。但現(xiàn)在 ant design vue4.x 都是基于 vue3,示例默認(rèn)是 TypeScript。比如 table 組件管理。

    2024年04月08日
    瀏覽(28)
  • vue3 快速入門系列 —— 組件通信

    vue3 快速入門系列 —— 組件通信

    組件通信在開發(fā)中非常重要,通信就是你給我一點(diǎn)東西,我給你一點(diǎn)東西。 本篇將分析 vue3 中組件間的通信方式。 Tip :下文提到的絕大多數(shù)通信方式在 vue2 中都有,但是在寫法上有一些差異。 在 vue3 基礎(chǔ)上進(jìn)行。 新建三個(gè)組件:爺爺、父親、孩子A、孩子B,在主頁 Home.vu

    2024年04月17日
    瀏覽(22)
  • Vue——狀態(tài)管理庫Pinia

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

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

    2024年02月07日
    瀏覽(24)
  • 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使用 Pinia 進(jìn)行狀態(tài)管理

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

    2024年02月13日
    瀏覽(37)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包