小白學Pinia狀態管理

目錄

1. 什么是 Pinia?

2. 為什么需要 Pinia?

3. Pinia 的三個核心概念

State(狀態)- 存儲數據

Getters(計算屬性)- 處理數據

Actions(方法)- 修改數據

4. 創建一個簡單的 Store

5. 在組件中使用 Store

6. 再來一個示例

7. 在組件中的使用示例

8. Pinia 的優勢

9. 常見使用場景

10. 學習建議


1. 什么是 Pinia?

Pinia 就像一個全局的數據倉庫,讓不同的 Vue 組件能夠共享數據

比喻:想象一個圖書館(Pinia),所有人(Vue組件)都可以去借書(讀取數據)、還書(修改數據)。

2. 為什么需要 Pinia?

問題場景

// 組件A需要用戶信息
const userInfo = { name: '張三', age: 25 }// 組件B也需要這個用戶信息
// 組件C也需要這個用戶信息
// 怎么在這些組件之間共享數據?

解決方案:用 Pinia 存儲全局數據,所有組件都能訪問。

3. Pinia 的三個核心概念

State(狀態)- 存儲數據

state: () => ({currentType: 'type1',  // 當前機器類型userInfo: null,        // 用戶信息count: 0              // 計數器
})

理解:State 就是存放數據的地方,類似于組件的?data。

Getters(計算屬性)- 處理數據

getters: {// 根據當前類型獲取配置currentConfig: (state) => {return state.machineConfig[state.currentType]},// 判斷是否是成年人isAdult: (state) => {return state.userInfo?.age >= 18}
}

理解:Getters 就像計算屬性,基于 state 計算出新的值。

Actions(方法)- 修改數據

actions: {// 設置機器類型setMachineType(type) {this.currentType = type},// 設置用戶信息setUserInfo(info) {this.userInfo = info}
}

理解:Actions 就是修改 state 的方法,類似于組件的?methods。

4. 創建一個簡單的 Store

讓我們創建一個用戶信息的 Store:

// store/user.js
import { defineStore } from 'pinia'export const useUserStore = defineStore('user', {// 1. State - 存儲數據state: () => ({name: '',age: 0,isLogin: false}),// 2. Getters - 計算屬性getters: {// 獲取用戶顯示名稱displayName: (state) => {return state.name || '游客'},// 判斷是否成年isAdult: (state) => {return state.age >= 18}},// 3. Actions - 修改數據的方法actions: {// 登錄login(name, age) {this.name = namethis.age = agethis.isLogin = true},// 登出logout() {this.name = ''this.age = 0this.isLogin = false}}
})

5. 在組件中使用 Store

<!-- UserProfile.vue -->
<template><div><h1>用戶信息</h1><p>姓名:{{ userStore.displayName }}</p><p>年齡:{{ userStore.age }}</p><p>狀態:{{ userStore.isLogin ? '已登錄' : '未登錄' }}</p><p>{{ userStore.isAdult ? '成年人' : '未成年人' }}</p><button @click="handleLogin">登錄</button><button @click="handleLogout">登出</button></div>
</template><script setup>
import { useUserStore } from '@/store/user'// 獲取 store 實例
const userStore = useUserStore()// 登錄方法
const handleLogin = () => {userStore.login('張三', 25)
}// 登出方法
const handleLogout = () => {userStore.logout()
}
</script>

6. 再來一個示例

創建一個機型配置?Store:

export const useMachineStore = defineStore('machine', {// 存儲機器相關數據state: () => ({currentType: 'type1',  // 當前機器類型machineConfig: {       // 機器配置信息type1: { name: '無打印', features: ['query', 'payment'] },type2: { name: '報告打印', features: ['query', 'payment', 'reportPrint'] },type3: { name: '發票打印', features: ['query', 'payment', 'invoicePrint'] }}}),// 基于數據計算新值getters: {// 獲取當前機器配置currentConfig: (state) => {return state.machineConfig[state.currentType]},// 檢查是否支持某功能hasFeature: (state) => {return (feature) => {const config = state.machineConfig[state.currentType]return config.features.includes(feature)}}},// 修改數據的方法actions: {// 切換機器類型setMachineType(type) {this.currentType = type}}
})

7. 在組件中的使用示例

<!-- MachineInfo.vue -->
<template><div><h2>{{ machineStore.currentConfig.name }}</h2><p>支持的功能:</p><ul><li v-if="machineStore.hasFeature('query')">查詢功能</li><li v-if="machineStore.hasFeature('payment')">繳費功能</li><li v-if="machineStore.hasFeature('reportPrint')">報告打印</li></ul><button @click="switchMachine">切換機器類型</button></div>
</template><script setup>
import { useMachineStore } from '@/store/machine'const machineStore = useMachineStore()const switchMachine = () => {// 切換到下一個類型const types = ['type1', 'type2', 'type3']const currentIndex = types.indexOf(machineStore.currentType)const nextIndex = (currentIndex + 1) % types.lengthmachineStore.setMachineType(types[nextIndex])
}
</script>

8. Pinia 的優勢

  1. 簡單易用:語法簡潔,容易理解。
  2. 類型安全:支持 TypeScript。
  3. 開發工具:有專門的調試工具。
  4. 模塊化:每個功能可以創建獨立的 store。

9. 常見使用場景

  • 用戶信息管理:登錄狀態、用戶資料。
  • 主題設置:暗色模式、語言設置。
  • 購物車:商品列表、總價計算。
  • 全局配置:API 地址、系統設置。

10. 學習建議

  1. 從簡單開始:先創建一個計數器 store。
  2. 理解概念state存數據,getters算數據,actions改數據
  3. 多練習:在實際項目中使用。
  4. 看文檔:官方文檔很詳細。

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

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

相關文章

Tauri2學習筆記

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程視頻不多&#xff0c;我按照Tauri1的教程來學習&…

SQL進階之旅 Day 26:分庫分表環境中的SQL策略

【SQL進階之旅 Day 26】分庫分表環境中的SQL策略 文章簡述 隨著業務規模的擴大&#xff0c;單一數據庫難以承載海量數據與高并發訪問。分庫分表成為解決這一問題的關鍵手段&#xff0c;但同時也帶來了 SQL 查詢復雜度的顯著提升。本文作為“SQL進階之旅”系列的第26天內容&…

linux之 內存管理(6)-arm64 內核虛擬地址空間變化

一、新內核變動 kernel變化的真快&#xff0c;之前我記得4.x的內核的內核空間的線性映射區位于內核空間的高地址處的128TB&#xff0c;且當前的博客和一些書籍也都還是這樣介紹。可翻了翻kernel的Documentation/arm64/memory.rst文檔&#xff0c;發現最新的kernel已將這128TB移…

循環神經網絡(RNN):從理論到翻譯

循環神經網絡&#xff08;RNN&#xff09;是一種專為處理序列數據設計的神經網絡&#xff0c;如時間序列、自然語言或語音。與傳統的全連接神經網絡不同&#xff0c;RNN具有"記憶"功能&#xff0c;通過循環傳遞信息&#xff0c;使其特別適合需要考慮上下文或順序的任…

window批處理文件(.bat),用來清理git的master分支

echo off chcp 65001 > nul setlocal enabledelayedexpansionecho 正在檢查Git倉庫... git rev-parse --is-inside-work-tree >nul 2>&1 if %errorlevel% neq 0 (echo 錯誤&#xff1a;當前目錄不是Git倉庫&#xff01;pauseexit /b 1 )echo 警告&#xff1a;這將…

C#中的CLR屬性、依賴屬性與附加屬性

CLR屬性的主要特征 封裝性&#xff1a; 隱藏字段的實現細節 提供對字段的受控訪問 訪問控制&#xff1a; 可單獨設置get/set訪問器的可見性 可創建只讀或只寫屬性 計算屬性&#xff1a; 可以在getter中執行計算邏輯 不需要直接對應一個字段 驗證邏輯&#xff1a; 可以…

【mysql】聯合索引和單列索引的區別

區別核心&#xff1a;聯合索引可加速多個字段組合查詢&#xff0c;單列索引只能加速一個字段。 &#x1f539;聯合索引&#xff08;復合索引&#xff09; INDEX(col1, col2, col3)適用范圍&#xff1a; WHERE col1 ... ? WHERE col1 ... AND col2 ... ? WHERE col1 ..…

如何用 HTML 展示計算機代碼

原文&#xff1a;如何用 HTML 展示計算機代碼 | w3cschool筆記 &#xff08;請勿將文章標記為付費&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 在編程學習和文檔編寫過程中&#xff0c;清晰地展示代碼是一項關鍵技能。HTML 作為網頁開發的基礎語言&#x…

大模型筆記_模型微調

1. 大模型微調的概念 大模型微調&#xff08;Fine-tuning&#xff09;是指在預訓練大語言模型&#xff08;如GPT、BERT、LLaMA等&#xff09;的基礎上&#xff0c;針對特定任務或領域&#xff0c;使用小量的目標領域數據對模型進行進一步訓練&#xff0c;使其更好地適配具體應…

React Native UI 框架與動畫系統:打造專業移動應用界面

React Native UI 框架與動畫系統&#xff1a;打造專業移動應用界面 關鍵要點 UI 框架加速開發&#xff1a;NativeBase、React Native Paper、UI Kitten 和 Tailwind-RN 提供預構建組件&#xff0c;幫助開發者快速創建美觀、一致的界面。動畫提升體驗&#xff1a;React Native…

在QT中使用OpenGL

參考資料&#xff1a; 主頁 - LearnOpenGL CN https://blog.csdn.net/qq_40120946/category_12566573.html 由于OpenGL的大多數實現都是由顯卡廠商編寫的&#xff0c;當產生一個bug時通常可以通過升級顯卡驅動來解決。 OpenGL中的名詞解釋 OpenGL 上下文&#xff08;Conte…

Qt::QueuedConnection詳解

在多線程編程中&#xff0c;線程間的通信是一個關鍵問題。Qt框架提供了強大的信號和槽機制來處理線程通信&#xff0c;其中Qt::QueuedConnection是一種非常有用的連接類型。本文將深入探討Qt::QueuedConnection的原理、使用場景及注意事項。 一、基本概念 Qt::QueuedConnecti…

X86 OpenHarmony5.1.0系統移植與安裝

近期在研究X86鴻蒙,通過一段時間的研究終于成功了,在X86機器上成功啟動了openharmony系統了.下面做個總結和分享 1. 下載源碼 獲取OpenHarmony標準系統源碼 repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v5.1.0-Release --no-repo-ve…

如何診斷服務器硬盤故障?出現硬盤故障如何處理比較好?

當服務器硬盤出現故障時&#xff0c;及時診斷問題并采取正確的處理方法至關重要。硬盤故障可能導致數據丟失和系統不穩定&#xff0c;影響服務器的正常運行。以下是診斷服務器硬盤故障并處理的最佳實踐&#xff1a; 診斷服務器硬盤故障的步驟 1. 監控警報 硬盤監控工具&#…

vue3提供的hook和通常的函數有什么區別

Vue 3 提供的 hook&#xff08;組合式函數&#xff09; 和普通函數在使用場景、功能和設計目的上有明顯區別&#xff0c;它們是 Vue 3 組合式 API 的核心概念。下面從幾個關鍵維度分析它們的差異&#xff1a; 1. 設計目的不同 Hook&#xff08;組合式函數&#xff09; 專為 Vu…

Spark提交流程

bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn ./examples/jars/spark-examples_2.12-3.3.1.jar 10 這一句命令實際上是 啟動一個Java程序 java org.apache.spark.deploy.SparkSubmit 并將命令行參數解析到這個類的對應屬性上 因為master給…

Microsoft Copilot Studio - 嘗試一下Agent

1.簡單介紹 Microsoft Copilot Studio以前的名字是Power Virtual Agent(簡稱PVA)。Power Virutal Agent是2019年出現的&#xff0c;是低代碼平臺Power Platform的一部分。當時Generative AI還沒有出現&#xff0c;但是基于已有的Conversation AI技術&#xff0c;即Microsoft L…

【源碼剖析】2-搭建kafka源碼環境

在上篇文章kafka核心概念中&#xff0c;解釋了kafka的核心概念&#xff0c;下面開始進行kafka源碼編譯。為什么學習源碼需要進行源碼編譯呢&#xff0c;我認為主要有兩點&#xff1a; 可以進行debug&#xff0c;跟蹤代碼執行邏輯可以對源碼改動&#xff0c;強化學習學習效果 …

小紅書視頻圖文提取:采集+CV的實戰手記

項目說明&#xff1a;這波視頻&#xff0c;值不值得采&#xff1f; 你有沒有遇到過這樣的場景&#xff1f;老板說&#xff1a;“我們得看看最近小紅書上關于‘旅行’的視頻都說了些什么。”團隊做數據分析的&#xff0c;立馬傻眼&#xff1a;官網打不開、接口抓不著、視頻不能…

Cloudflare 從 Nginx 到 Pingora:性能、效率與安全的全面升級

在互聯網的快速發展中&#xff0c;高性能、高效率和高安全性的網絡服務成為了各大互聯網基礎設施提供商的核心追求。Cloudflare 作為全球領先的互聯網安全和基礎設施公司&#xff0c;近期做出了一個重大技術決策&#xff1a;棄用長期使用的 Nginx&#xff0c;轉而采用其內部開發…