六十天前端強化訓練之第二十七天之Pinia 狀態管理全解與購物車實戰案例

=====歡迎來到編程星辰海的博客講解======

看完可以給一個免費的三連嗎,謝謝大佬!

目錄

一、Pinia 深度解析

1. Pinia 核心設計

2. 核心概念圖解

3. Store 類型對比

Option Store(選項式)

Setup Store(組合式)

4. 響應式原理

二、購物車狀態管理實戰

1. 項目結構

2. 核心 Store 實現(stores/cart.js)

3. 商品列表組件(ProductList.vue)

4. 購物車組件(ShoppingCart.vue)

三、實現效果說明

四、學習要點總結

五、擴展閱讀推薦

官方資源

優質文章

進階教程


一、Pinia 深度解析

1. Pinia 核心設計

Pinia 是 Vue 官方推薦的新一代狀態管理庫,具有以下核心優勢:

  • TypeScript 原生支持:完整的類型推斷和自動補全
  • 模塊化架構:天然支持代碼分割和按需加載
  • 輕量無冗余:相比 Vuex 減少 40% 的代碼量
  • 組合式 API:完美對接 Vue3 的組合式編程范式
  • Devtools 整合:完整的時間旅行調試支持

2. 核心概念圖解

3. Store 類型對比

Option Store(選項式)

JAVASCRIPT

export const useCounterStore = defineStore('counter', {state: () => ({ count: 0 }),getters: {double: (state) => state.count * 2,},actions: {increment() {this.count++},},
})
Setup Store(組合式)

JAVASCRIPT

export const useCounterStore = defineStore('counter', () => {const count = ref(0)const double = computed(() => count.value * 2)function increment() {count.value++}return { count, double, increment }
})

4. 響應式原理

Pinia 基于 Vue3 的 reactive() 實現響應式系統:

  • State 自動轉換為 reactive 對象
  • Getters 使用 computed 實現計算緩存
  • Actions 作為狀態操作方法

二、購物車狀態管理實戰

1. 項目結構

TEXT

/src├── stores│    └── cart.js├── components│    ├── ProductList.vue│    └── ShoppingCart.vue└── App.vue

2. 核心 Store 實現(stores/cart.js)

JAVASCRIPT

import { defineStore } from 'pinia'
import { computed, ref } from 'vue'export const useCartStore = defineStore('cart', () => {// 狀態定義const items = ref([]) // 購物車商品數組const taxRate = 0.1 // 稅率(常量)// Getter(帶參數的派生狀態)const cartTotal = computed(() => items.value.reduce((sum, item) => sum + item.price * item.quantity, 0))const totalWithTax = computed(() => cartTotal.value * (1 + taxRate))// Action:添加商品(冪等操作)const addToCart = (product, quantity = 1) => {const existing = items.value.find(item => item.id === product.id)if (existing) {// 商品存在時增加數量existing.quantity += quantity} else {// 新商品添加購物車items.value.push({...product,quantity,addedAt: new Date().toISOString()})}}// Action:移除商品(支持完全移除和減少數量)const removeFromCart = (productId, quantity = 1) => {const index = items.value.findIndex(item => item.id === productId)if (index === -1) returnif (items.value[index].quantity <= quantity) {// 完全移除商品items.value.splice(index, 1)} else {// 減少商品數量items.value[index].quantity -= quantity}}// Action:清空購物車const clearCart = () => {items.value = []}return {items,cartTotal,totalWithTax,addToCart,removeFromCart,clearCart}
})

3. 商品列表組件(ProductList.vue)

VUE

<script setup>
import { useCartStore } from '@/stores/cart'const cartStore = useCartStore()
const products = [{ id: 1, name: 'Vue T-Shirt', price: 29.99 },{ id: 2, name: 'Pinia Mug', price: 15.50 },{ id: 3, name: 'Vuex Book', price: 39.99 }
]
</script><template><div class="product-list"><h2>Available Products</h2><div v-for="product in products" :key="product.id" class="product-item"><h3>{{ product.name }}</h3><p>Price: \${{ product.price.toFixed(2) }}</p><button @click="cartStore.addToCart(product)">Add to Cart</button></div></div>
</template>

4. 購物車組件(ShoppingCart.vue)

VUE

<script setup>
import { useCartStore } from '@/stores/cart'
import { storeToRefs } from 'pinia'const cartStore = useCartStore()
const { items, cartTotal, totalWithTax } = storeToRefs(cartStore)
</script><template><div class="shopping-cart"><h2>Shopping Cart</h2><div v-if="items.length === 0" class="empty-cart">Your cart is empty</div><div v-else><div v-for="item in items" :key="item.id" class="cart-item"><h3>{{ item.name }}</h3><p>Quantity: {{ item.quantity }}<button @click="cartStore.removeFromCart(item.id, 1)">-</button><button @click="cartStore.addToCart(item)">+</button></p><p>Price: \${{ (item.price * item.quantity).toFixed(2) }}</p><button @click="cartStore.removeFromCart(item.id, item.quantity)">Remove</button></div><div class="totals"><p>Subtotal: \${{ cartTotal.toFixed(2) }}</p><p>Tax (10%): \${{ (totalWithTax - cartTotal).toFixed(2) }}</p><p class="total">Total: \${{ totalWithTax.toFixed(2) }}</p></div><button @click="cartStore.clearCart" class="clear-btn">Clear Cart</button></div></div>
</template>

三、實現效果說明


(圖示說明:用戶添加商品、調整數量、刪除商品時,各組件自動同步狀態)

  1. 狀態共享:多組件同時訪問同一購物車狀態
  2. 響應式更新:價格計算實時同步
  3. 操作隔離:商品增減邏輯集中管理
  4. 類型安全:完整的TS類型推斷

四、學習要點總結

  1. 核心概念

    • Store 作為狀態容器
    • State 定義應用狀態
    • Getters 實現派生數據
    • Actions 封裝業務邏輯
  2. 最佳實踐

    JAVASCRIPT

    // 正確的狀態解構方式
    const { count } = storeToRefs(store)
    // 錯誤的方式(破壞響應式)
    const { count } = store
    
  3. 架構原則

    • 單一職責:每個Store聚焦特定領域
    • 低耦合:組件不直接操作其他Store
    • 高內聚:相關邏輯集中管理
  4. 調試技巧

    JAVASCRIPT

    // 瀏覽器控制臺訪問
    const store = useCartStore()
    store.$patch({...})
    store.$subscribe((mutation) => {console.log('狀態變更:', mutation)
    })
    

五、擴展閱讀推薦

官方資源

  1. Pinia 官方文檔
  2. Vue 狀態管理指南
  3. Pinia 與 Vuex 對比指南

優質文章

  1. 深入理解 Pinia 架構設計
  2. 企業級 Pinia 最佳實踐
  3. Pinia 插件開發指南
  4. SSR 場景下的 Pinia 使用
  5. Pinia 單元測試全攻略

進階教程

JAVASCRIPT

// 持久化插件示例
import { createPinia } from 'pinia'
import { createPersistedState } from 'pinia-plugin-persistedstate'const pinia = createPinia()
pinia.use(createPersistedState({auto: true, // 自動持久化所有Storestorage: sessionStorage
}))

建議運行示例并通過 Vue Devtools 觀察狀態變更過程,加深理解。義和測試用例。

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

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

相關文章

計算機網絡技術服務管理基于Spring Boot-SSM

目錄 一、引言 二、用戶需求分析 三、功能介紹 ??3.1.資源管理?&#xff1a; ?3.2.故障管理?&#xff1a; ?3.3.性能管理?&#xff1a; ?3.4.安全管理?&#xff1a; ?3.5.配置管理?&#xff1a; ?3.6.日志管理?&#xff1a; ?3.7.用戶管理?&#xff1…

深度學習驅動下的字符識別:挑戰與創新

一、引言 1.1 研究背景 深度學習在字符識別領域具有至關重要的地位。隨著信息技術的飛速發展&#xff0c;對字符識別的準確性和效率要求越來越高。字符識別作為計算機視覺領域的一個重要研究方向&#xff0c;其主要目的是將各種形式的字符轉換成計算機可識別的文本信息。近年…

Java多線程與高并發專題——Future 是什么?

引入 在上一篇Callable 和 Runnable 的不同&#xff1f;的最后&#xff0c;我們有提到和 Callable 配合的有一個 Future 類&#xff0c;通過 Future 可以了解任務執行情況&#xff0c;或者取消任務的執行&#xff0c;還可獲取任務執行的結果&#xff0c;這些功能都是 Runnable…

【vue的some和filter】

在 Vue 中&#xff0c;some 和 filter 是兩種不同的數組方法&#xff0c;分別用于處理數據篩選和條件判斷。以下是它們在 Vue 中的具體用法和區別&#xff1a; 一、filter 方法 作用&#xff1a;對數組進行過濾&#xff0c;返回符合條件的新數組。 使用場景&#xff1a;常用于…

用ArcGIS做一張符合環評要求的植被類型圖

植被類型圖是環境影響評價&#xff08;環評&#xff09;中的重要圖件&#xff0c;需滿足數據準確性、制圖規范性和信息完整性等要求。本教程將基于ArcMap平臺&#xff0c;從數據準備到成果輸出&#xff0c;詳細講解如何制作符合環評技術規范的植被類型圖。 ArcGIS遙感解譯土地…

Fourier-Lerobot——把斯坦福人形動作策略iDP3封裝進了Lerobot(含我司七月人形研發落地實踐)

前言 近期在摳lerobot源碼時&#xff0c;看到其封裝了ALOHA ACT、diffusion policy、π0時&#xff0c;我就在想&#xff0c;lerobot其實可以再封裝下idp3 我甚至考慮是否從我聯合帶的那十幾個具身研究生中選幾個同學做下這事&#xff0c;對他們也是很好的歷練然當25年3.18日…

MySQL拒絕訪問

1. 問題 使用圖形界面工具連接MySQL數據庫&#xff0c;拒絕訪問&#xff01; 2. 解決方法 以管理員的身份打開cmd&#xff0c;輸入命令&#xff0c;啟動MySQL net start mysql版本號 3. 參考 暫無

多模態SVG生成新標桿:StarVector從圖像文本生成高精度SVG的AI模型

一、引言&#xff1a;矢量圖形的崛起與挑戰 在現代數字世界中&#xff0c;圖像扮演著至關重要的角色&#xff0c;而可伸縮矢量圖形&#xff08;SVG&#xff09;正因其獨特的優勢&#xff0c;在網頁設計、圖形設計等領域占據著越來越重要的地位。與傳統的基于像素的柵格圖像不同…

Netty——BIO、NIO 與 Netty

文章目錄 1. 介紹1.1 BIO1.1.1 概念1.1.2 工作原理1.1.3 優缺點 1.2 NIO1.2.1 概念1.2.2 工作原理1.2.3 優缺點 1.3 Netty1.3.1 概念1.3.2 工作原理1.3.3 優點 2. Netty 與 Java NIO 的區別2.1 抽象層次2.2 API 易用性2.3 性能優化2.4 功能擴展性2.5 線程模型2.6 適用場景 3. 總…

游戲引擎學習第175天

回顧和今天的計劃 今天的主要任務是完成稀疏 Unicode 支持。之前我們已經完成了所有的思考和設計工作&#xff0c;但代碼部分尚未完成&#xff0c;因為有許多內容需要調整和重構。因此&#xff0c;今天的目標就是把這些內容全部整理好并最終實現。 回顧當前測試資源構建器的狀…

零基礎上手Python數據分析 (7):Python 面向對象編程初步

寫在前面 回顧一下,我們已經學習了 Python 的基本語法、數據類型、常用數據結構和文件操作、異常處理等。 到目前為止,我們主要采用的是 面向過程 (Procedural Programming) 的編程方式,即按照步驟一步一步地編寫代碼,解決問題。 這種方式對于簡單的任務已經足夠,但當程序…

CNN的空間歸納偏置(Inductive Bias):深入解析其本質與影響(與transformer的比較)

CNN的空間歸納偏置&#xff08;Inductive Bias&#xff09;&#xff1a;深入解析其本質與影響 在深度學習領域&#xff0c;卷積神經網絡&#xff08;Convolutional Neural Networks, CNN&#xff09;和Transformer代表了兩種截然不同的設計哲學。CNN憑借其卓越的性能長期主導計…

1-4 麻雀優化深度核極限學習機超參數

本博客來源于CSDN機器魚&#xff0c;未同意任何人轉載。 更多內容&#xff0c;歡迎點擊本專欄目錄&#xff0c;查看更多內容。 目錄 0.引言 1.原理 2.具體實現 3.結語 0.引言 在博客【深度核極限學習機】里我們講述了深度核極限學習機原理&#xff0c;今天我們對其繼續進…

miniconda安裝保姆級教程|win11|深度學習環境配置

一、官網安裝miniconda miniconda官網&#xff1a;Miniconda - Anaconda 點擊Download按鈕 在紅框位置輸入郵箱并點擊submit&#xff0c;下載鏈接將會發到郵箱中 郵箱中將會收到如圖所示郵件&#xff0c;點擊下載 選擇windows對應的miniconda安裝包 miniconda安裝包安裝完成如…

AI安全、大模型安全研究(DeepSeek)

DeepSeek 點燃AI應用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1國產大模型的發布,以技術創新驚艷了全球,更是極致的性價比推動國內千行百業接入 AI,政府、企業競速開發智能業務處理、智能客服、代碼生成、營銷文案等應用,“落地效率” 成為第一關鍵詞。然而與此相…

機器學習——Numpy的神奇索引與布爾索引

在 NumPy 中&#xff0c;神奇索引&#xff08;Fancy Indexing&#xff09; 和 布爾索引&#xff08;Boolean Indexing&#xff09; 是兩種強大的索引方式&#xff0c;用于從數組中提取特定元素或子集。以下是它們的詳細說明和示例&#xff1a; 1. 神奇索引&#xff08;Fancy In…

Android Studio最后一個綁定JDK8的版本,但是官方下載是最新的,怎么下載Android Studio歷史版本包,這篇文章幫你解決。

最近需要安裝Android Studio 編輯器 發現官網最新的編輯器已經不支持 jdk8了 經過查閱資料&#xff1a; Android Studio最后一個綁定JDK8的版本:4.1.3 下載地址&#xff1a;https://developer.android.google.cn/studio/archive 如果你打開是這樣的 下載頁 這是因為你用的中…

Next-Auth 認證系統:用戶與管理員雙角色登錄配置

概述 本文檔介紹了如何使用 Next-Auth 配置一個同時支持普通用戶和管理員用戶登錄的認證系統。 基本配置 首先&#xff0c;我們需要設置 Next-Auth 的基本配置&#xff0c;包括提供者、回調函數和頁面路由。 import type { NextAuthConfig } from next-auth import type { …

CentOS配置永久靜態IP

在 CentOS 6 中&#xff0c;配置永久 IP 地址需要修改網絡配置文件。以下是詳細步驟&#xff1a; 1. 找到網卡名稱 首先&#xff0c;確定你需要配置 IP 的網卡名稱&#xff0c;通常是 eth0 或類似的名稱。 運行以下命令查看網卡信息&#xff1a; bash ifconfig或者&#xf…

springboot Actuator 指標分析

http.server.requests HTTP 接口性能瓶頸 http.server.requests.max system.cpu.usage 代碼熱點分析或橫向擴容 核心接口性能指標&#xff0c;包含以下維度&#xff1a; count&#xff1a;請求總數 max/sum&#xff1a;最大及總響應時間 status&#xff1a;HTTP 狀態碼分布&a…