react笔记之添加删除购物车

简介: react笔记之添加删除购物车

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;

image.png

image.png

相关文章
|
7天前
|
前端开发 JavaScript UED
React 基础与实践 | 青训营笔记
React 基础与实践 | 青训营笔记
12 0
|
1月前
|
前端开发 JavaScript Java
React 速通笔记
【7月更文挑战第17天】
28 1
|
3月前
|
JavaScript 前端开发 搜索推荐
构建一个基于React和Redux的简易电商购物车应用
构建一个基于React和Redux的简易电商购物车应用
47 0
|
3月前
|
前端开发 JavaScript
基于React的简易在线购物车设计与实现
基于React的简易在线购物车设计与实现
87 0
|
3月前
|
前端开发
React 购物车小球动画
React 购物车小球动画
|
3月前
|
前端开发
React 拖动进入购物车
React 拖动进入购物车
428 0
|
3月前
|
前端开发 JavaScript
前端知识笔记(二十六)———React如何像Vue一样将css和js写在同一文件
前端知识笔记(二十六)———React如何像Vue一样将css和js写在同一文件
47 1
|
3月前
|
前端开发
react函数组件购物车小球动画实现
react函数组件购物车小球动画实现
65 0
react函数组件购物车小球动画实现
|
9月前
|
前端开发
前端笔记:React的form表单全部置空或者某个操作框置空的做法
在React框架前端开发中,经常会有弹出框的开发,涉及到弹出框,难免就会有表单。一般在关闭弹出框或者对表单联动时,往往都需要考虑对表单进行置空操作了。
72 0
|
前端开发
React 购物车实现抛物线效果
React 购物车实现抛物线效果
89 0