Vue3状态管理库Pinia——实现简易版购物车

news2024/11/17 9:31:19

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒Three.js 🍖JS版算法
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

Pinia

内容参考链接
Vue3正式发布那么久了,你认识Pinia了吗?认识Pinia,搭建开发环境
Pinia 核心概念核心概念(Store、State、Getter、Action)

文章目录

  • Pinia
    • ✨✨前言
    • ✨✨Pinia 实战购物车
    • 🎉🎉本篇小结


✨✨前言

各位新朋友、老朋友们大家好,这里是前端杂货铺,欢迎各位的到来!!

上篇文章 我们学习了 Store、State、Getter、Action 的概念以及基本的使用。实践出真知,这篇文章我们通过以上所学知识实现一个简单的购物车功能。


✨✨Pinia 实战购物车

  • 单选全选,并可以互相联动(全选勾上,单选自动全勾上。单选全勾上,全选自动勾上)
  • 小计(当前商品单价 * 当前商品数量)
  • 总计(所有商品的小计之和)

在这里插入图片描述


shop.vue

该组件用于构建UI,搭建基本的页面结构。所有的属性和方法我们放在 Pinia 中去管理。

全选和单选的联动,我们使用断言返回的 true/false 进行判断。

<template>
    <div>
        <h3 style="color: orange">前端杂货铺的购物车</h3>
    </div>
    <div>全选 <input type="checkbox" v-model="shopStore.isAllSelect" @change="allSelectChange"></div>
    <div>
        <div v-for="(item, index) in shopStore.goods" :key="index">
            <input type="checkbox" @change="singleChange" v-model="item.select">
            【商品】:<span style="color:red">{{ item.name }}</span> -- 
            【价格】:<span style="color:pink">{{ item.price }}</span>--
            <button @click="updateNum(index, 1)">+</button>
            <span style="color: blue">{{ item.num || 1 }}</span>【件】
            <button @click="updateNum(index, -1)">-</button>
            【小计】:<span style="color:brown">{{ item.price * (item.num || 1) }}</span>
        </div>
    </div>
    <div>
        总价 {{ shopStore.total }}
    </div>
</template>

<script setup lang="ts">
import { useShopStore } from './store/shop';

const shopStore = useShopStore();

const updateNum = (index: number, num: number) => {
    shopStore.updateNum(index, num);
}

const allSelectChange = () => {
    shopStore.allSelectChange();
}

const singleChange = () => {
    shopStore.singleChange();
}
</script>

./store/shop.ts

把数据状态存放到 state 中,在这里我们存放了 “啤酒” 、“饮料”、“泉水”,以及全选的属性。在 shop.vue 中的属性也是在该文件中定义的,我们先定义了接口(Interface),之后在合适的位置进行相应的使用。

注意函数和参数等进行相应的类型限制。

import { defineStore } from 'pinia'

// 接口
interface IGoods {
    name: string
    price: number
    num?: number // 默认没有
    select?: boolean // 默认没有
}

export const useShopStore = defineStore('shop', {
    state() {
        return {
            goods: [
                {
                    name: '啤酒',
                    price: 5
                },
                {
                    name: '饮料',
                    price: 4
                },
                {
                    name: '泉水',
                    price: 2
                },

            ] as IGoods[],
            isAllSelect: false
        }
    },
    getters: {
        total (): number {
            return this.goods.filter(item => item.select).reduce((total, item) => total += (item.num || 1) * item.price, 0)
        }
    },
    actions: {
        updateNum(index: number, num: number) {
            this.goods[index].num = this.goods[index].num || 1

            // -! 会告诉编译器,xx肯定不是 null 或 undefined
            this.goods[index].num! += num
        },

        allSelectChange() {
            this.goods.forEach(item => {
                item.select = this.isAllSelect
            })
        },

        singleChange() {
            this.isAllSelect = this.goods.every(item => item.select)
        }
    }
})

main.ts

导入创建 Shop 并使用 pinia,最后挂载到 #app

import { createApp } from 'vue'
import './style.css'
import pinia from './store'
import Shop from './shop.vue'

createApp(Shop).use(pinia).mount('#app')

./store/index.ts

导入 pinia,创建实例并暴露出去

import { createPinia } from 'pinia'

const pinia = createPinia()

export default pinia

终端键入:npm run dev,在浏览器打开即可


🎉🎉本篇小结

这是一篇很简单的文章。“麻雀虽小,五脏俱全”。我们构建 购物车 案例,就是为了巩固我们前两节所学的知识,使得我们对 Pinia 状态管理库有一个更加清晰的认识。


好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. Pinia 官方文档
  2. Pinia 教程 【作者:千锋教育】

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/827150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重排序问题(详细说明指令重排序)

在执行程序时&#xff0c;为了提高性能&#xff0c;编译器和处理器常常会对指令做重排序。 重排序分3种类型。 编译器优化的重排序。编译器在不改变单线程程序语义的前提下&#xff0c;可以重新安排语句的执行顺序。 指令级并行的重排序。现代处理器采用了指令级并行技术&…

MySQL主从复制原理以及实操

一、MySQL主从复制原理&#xff1a; 1、MySQL将数据变化记录到二进制日志中&#xff1b; 2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中&#xff1b; 3、Slave将中继日志中的事件在做一次&#xff0c;将数据变化&#xff0c;反应到自身&#xff08;Slave&#xff09;的数…

在Geogle Drive 上面下载压缩的文件

需要使用到 OCC3D 上面 的Waymo Occupancy 真值。 Occ3d 应该是一个文件夹里面有很多 个压缩包&#xff0c;如果直接下载 会下载很多个文件。 双击点进去 选择好对应的序列再进行下载。 这里的 000 001 应该是对应的 waymo 的相机序列。 waymo 的相机序列也是798 个序列

【数据结构】常见的排序算法

常见的排序算法 常见的排序算法插入排序之直接插入排序时间复杂度特性总结 插入排序之希尔排序时间复杂度 选择排序之直接选择排序特性总结 选择排序之堆排序时间复杂度特性总结 交换排序之冒泡排序特性总结 交换排序之快速排序hoare版本挖坑法双指针法快速排序的优化1&#xf…

(YouTube)KDBA QML 学习笔记1

&#xff08;YouTube&#xff09;KDBA QML 学习笔记 旧版本(QML文件介绍) main.qml import QtQuick 2.0Text {text: "Hell World" }main.cpp #include <QtQuick>int mian(int argc, char *argn[]) {QGuiApplication app(argc, argv);//QT开始 QQuickvi…

maven下载安装及初次使用相关配置

maven下载按照及初次使用相关配置 一、下载 与安装 下载完解压放在文件夹中即可&#xff01; 依赖Java&#xff0c;需要配置JAVA_HOME设置MAVEN自身的运行环境&#xff0c;需要配置MAVEN_HOME&#xff08;参考安装java&#xff09;测试环境配置结果 MVN测试成功&#xff01…

大牛练成记:用JavaScript徒手写出一个日期选择插件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;100个JavaScript的小应用。 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收…

OpenMMLab MMDetectionV3.1.0-SAM(环境安装、模型测试、训练以及模型后处理工具)

OpenMMLab Playground 概况 当前通用目标检测的研究方向正在朝着大型多模态模型发展。除了图像输入之外&#xff0c;最近的研究成果还结合了文本模式来提高性能。添加文本模态后&#xff0c;通用检测算法的一些非常好的属性开始出现&#xff0c;例如&#xff1a; 可以利用大量…

【多线程系列-04】深入理解java中线程间的通信机制

多线程系列整体栏目 内容链接地址【一】深入理解进程、线程和CPU之间的关系https://blog.csdn.net/zhenghuishengq/article/details/131714191【二】java创建线程的方式到底有几种&#xff1f;(详解)https://blog.csdn.net/zhenghuishengq/article/details/127968166【三】深入…

如何通过 5 步激活策略扩大用户群

假设&#xff0c;你现在是一个“深藏功与名”的增长黑客。前期你表现非常好&#xff0c;做了一些拉新实验&#xff0c;每天都有上千用户进入到产品。团队成员和家人朋友都非常开心你们的产品增长终于有了起色。 然而&#xff0c;如果你不重视拉新&#xff08;acquisition&…

TI的IWR6843跑3D People Tracking(3D人体检测追踪实验)demo的上手教程

1.硬件准备 1.IWR6843板子 2.两个USB转串口模块&#xff08;因为我的是自己做的板子&#xff0c;板子上没有集成USB转串口芯片&#xff09; 2.软件准备 1.最新版本的CCS&#xff0c;注意后缀没有THEIA https://www.ti.com/tool/CCSTUDIO?DCMPdsp_ccs_v4&HQSccs 2.最新…

速通pytorch库

速通pytorch库&#xff08;长文&#xff09; 前言 ​ 本篇文章主要为那些对于pytorch库不熟悉、还没有上手的朋友们准备&#xff0c;梳理pytorch库的主要内容&#xff0c;帮助大家入门深度学习最重要的库之一。 目录结构 文章目录 速通pytorch库&#xff08;长文&#xff09;1.…

13 springboot项目——准备数据和dao类

13.1 静态资源下载 https://download.csdn.net/download/no996yes885/88151513 13.2 静态资源位置 css样式文件放在static的css目录下&#xff1b;static的img下放图片&#xff1b;template目录下放其余的html文件。 13.3 创建两个实体类 导入依赖&#xff1a;lombok <!…

35岁后的测试工程师出路?测试工程师能干多久?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 你有没有一刹那意…

服务器硬件、部署LNMP动态网站、部署wordpress、配置web与数据库服务分离、配置额外的web服务器

day01 day01项目实战目标单机安装基于LNMP结构的WordPress网站基本环境准备配置nginx配置数据库服务部署wordpressweb与数据库服务分离准备数据库服务器迁移数据库配置额外的web服务器 项目实战目标 主机名IP地址client01192.168.88.10/24web1192.168.88.11/24web2192.168.88…

产业大数据应用:精准剖析区域产业,摸家底 明方向 促发展

随着信息技术的飞速发展&#xff0c;大数据和新一代信息技术的崛起&#xff0c;这些技术的应用正在逐渐渗透到各个领域&#xff0c;在区域产业发展上&#xff0c;他们不仅为区域产业诊断分析带来了高效的工具&#xff0c;更为区域制定产业发展战略和政策提供了有效的数据支撑。…

活动预告 | 中国数据库联盟(ACDU)中国行第二站定档杭州,邀您探讨数据库技术与实践!

数据库技术一直是信息时代中不可或缺的核心组成部分&#xff0c;随着信息量的爆炸式增长和数据的多样化&#xff0c;其重要性愈发凸显。作为中国数据库联盟&#xff08;ACDU&#xff09;的品牌活动之一&#xff0c;【ACDU 中国行】在线下汇集数据库领域的行业知名人士&#xff…

Keil出现Flash Timeout.Reset the Target and try it again.我有一种解决方法

2.解决方法 网上查找了找原因&#xff0c;是因为之前代码设置了读保护功能。 读保护即大家通常说的“加密”&#xff0c;是作用于整个Flash存储区域。一旦设置了Flash的读保护&#xff0c;内置的Flash存储区只能通过程序的正常执行才能读出&#xff0c;而不能通过下述任何一种…

echarts绘制关系图

效果图&#xff1a; 代码&#xff1a; <template><div id"serveGraph" style"height: 100%; width: 100%; z-index: 88;"></div> </template> <script> import { defineComponent,reactive,toRefs,onMounted,watch } from …

网络工程师 快速入门

需要掌握 以下技术 1.网络 基础 知识 TCP/IP 、OSI 7层协议、IP地址、ARP地址解析协议、ICMP&#xff08;英特网控制报文协议&#xff0c;ping&#xff09;等 入门面试常问问题。 2.路由 路由匹配 三原则、静态路由、OSPF路由协议。 2.交换 如何放数据&#xff1f; VLAN TRU…