react笔记之添加删除购物车
前言
我是歌谣 我有个兄弟 巅峰的时候排名c站总榜19 叫前端小歌谣 曾经我花了三年的时间创作了他 现在我要用五年的时间超越他 今天又是接近兄弟的一天人生难免坎坷 大不了从头再来 歌谣的意志是永恒的 放弃很容易 但是坚持一定很酷 微信公众号前端小歌谣 关注公众号带你进入前端学习交流群
app.js
import React, {useState} from 'react'; import Meals from "./components/Meals/Meals"; // 模拟一组食物数据 const MEALS_DATA = [ { id: '1', title: '汉堡包', desc: '百分百纯牛肉配搭爽脆酸瓜洋葱粒与美味番茄酱经典滋味让你无法抵挡!', price: 12, img: '/img/meals/1.png' }, { id: '2', title: '双层吉士汉堡', desc: '百分百纯牛肉与双层香软芝,加上松软面包及美味酱料,诱惑无人能挡!', price: 20, img: '/img/meals/2.png' }, { id: '3', title: '巨无霸', desc: '两块百分百纯牛肉,搭配生菜、洋葱等新鲜食材,口感丰富,极致美味!', price: 24, img: '/img/meals/3.png' }, { id: '4', title: '麦辣鸡腿汉堡', desc: '金黄脆辣的外皮,鲜嫩幼滑的鸡腿肉,多重滋味,一次打动您挑剔的味蕾!', price: 21, img: '/img/meals/4.png' }, { id: '5', title: '板烧鸡腿堡', desc: '原块去骨鸡排嫩滑多汁,与翠绿新鲜的生菜和香浓烧鸡酱搭配,口感丰富!', price: 22, img: '/img/meals/5.png' }, { id: '6', title: '麦香鸡', desc: '清脆爽口的生菜,金黄酥脆的鸡肉。营养配搭,好滋味的健康选择!', price: 14, img: '/img/meals/6.png' }, { id: '7', title: '吉士汉堡包', desc: '百分百纯牛肉与香软芝士融为一体配合美味番茄醬丰富口感一咬即刻涌现!', price: 12, img: '/img/meals/7.png' } ]; const App = () => { // 创建一个state用来存储食物列表 const [mealsData, setMealsData] = useState(MEALS_DATA); // 创建一个state,用来存储购物车的数据 /* * 1.商品 [] items * 2.商品总数(totalAmount) * 3.商品总价(totalPrice) * */ const [cartData, setCartData] = useState({ items: [], totalAmount: 0, totalPrice: 0 }); // 向购物车中添加商品 const addMealHandler = (meal) => { // meal 要添加进购物车的商品 // 对购物车进行复制 const newCart = {...cartData}; // 判断购物车中是否存在该商品 if (newCart.items.indexOf(meal) === -1) { // 将meal添加到购物车中 newCart.items.push(meal); // 修改商品的数量 meal.amount = 1; } else { // 增加商品的数量 meal.amount += 1; } // 增加总数 newCart.totalAmount += 1; // 增加总金额 newCart.totalPrice += meal.price; // 重新设置购物车 setCartData(newCart); }; //减少商品的数量 const subMealHandler = (meal) => { // 复制购物车 const newCart = {...cartData}; // 减少商品的数量 meal.amount -= 1; // 检查商品数量是否归0 if(meal.amount === 0){ // 从购物车中移除商品 newCart.items.splice(newCart.items.indexOf(meal), 1); } // 修改商品总数和总金额 newCart.totalAmount -= 1; newCart.totalPrice -= meal.price; setCartData(newCart); }; /* * React.Fragment * - 是一个专门用来作为父容器的组件 * 它只会将它里边的子元素直接返回,不会创建任何多余的元素 * - 当我们希望有一个父容器 * 但同时又不希望父容器在网页中产生多余的结构时 * 就可以使用Fragment * */ return ( <div> <Meals mealsData={mealsData} onAdd={addMealHandler} onSub={subMealHandler} /> </div> ); }; export default App;
我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南