=====欢迎来到编程星辰海的博客讲解======

看完可以给一个免费的三连吗,谢谢大佬!

目录

一、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…