react实现购物车(方法一)

Cart.jsx组件

import React, { Component } from 'react'
import Prolist from './Prolist'
export default class Cart extends Component {
    state = {
        carts: [
            { id: 1, name: '足球鞋', price: 25, count: 1, isChecked: false },
            { id: 2, name: '篮球鞋', price: 35, count: 1, isChecked: false },
            { id: 3, name: '草鞋', price: 125, count: 1, isChecked: false }
        ],
        // 总价
        total: 0,
        // 全选状态
        allCheckStatus: false
    }
    // 加
    add = (id) => {
        let carts = [...this.state.carts];
        carts.forEach(item => {
            if (item.id === id) {
                item.count++;
            }
        });
        this.setState({ carts }, () => {
            this.updateTotal();
        });
    }
    // 减
    reduce = (id) => {
        let carts = [...this.state.carts];
        carts.forEach(item => {
            if (item.id === id) {
                if (item.count > 1) {
                    item.count--;
                }
            }
        });
        this.setState({ carts }, () => {
            this.updateTotal();
        });
    }
    // 选中状态改变
    onCheckStatus = (id) => {
        let carts = [...this.state.carts];
        carts.forEach(item => {
            if (item.id === id) {
                item.isChecked=!item.isChecked
            }
        });
        this.setState({carts}, () => {
            this.updateTotal();
        });
    }
    // 全选状态改变
    onAllCheckStatus = (e) => {
        let allCheckStatus = e.target.checked;
        let carts = [...this.state.carts];
        carts.forEach(item => {
            item.isChecked = allCheckStatus;
        });
        this.setState({ carts, allCheckStatus }, () => {
            this.updateTotal();
        }); 
    }
    // 更新总价
    updateTotal = () => {
        let total = 0;
        this.state.carts.forEach(item => {
            if (item.isChecked) {
                total += item.price * item.count;
            }
        });
        this.setState({ total }, () => {
            this.updateAllCheckStatus();
        });
    }
    updateAllCheckStatus = () => {
        let allCheckStatus = this.state.carts.every(item => item.isChecked);
        this.setState({ allCheckStatus });
    }
    render() {
        return (
            <div>
                <table border={1}>
                    <tr>
                        <td></td>
                        <td>商品名称</td>
                        <td>单价</td>
                        <td>数量</td>
                    </tr>
                    {this.state.carts.map(item => {
                        return (
                            <Prolist key={item.id} item={item} add={this.add} reduce={this.reduce} onCheckStatus={this.onCheckStatus} />
                        )
                    })}
                </table>
                <div className="allCheck">
                    {/* 需要根据我们定义的属性来判断是否是全选 */}
                    <input type="checkbox" checked={this.state.allCheckStatus ? 'checked' : ''} onChange={this.onAllCheckStatus} />全选
                    <h1 className="total">总计:¥{this.state.total}</h1>
                </div>
            </div>
        )
    }
}

Prolist.jsx组件

import React, { Component } from 'react'
export default class Prolist extends Component {
    state={
        num:1
    }
    // 点击加号按钮
    childAdd = () => {
        const {add,item} = this.props
        add(item.id)
    }
    // 点击减号按钮
    childReduce = () => {
        const {reduce,item} = this.props
        reduce(item.id)
    }

    handleChange=()=>{
        const {onCheckStatus,item} = this.props
        onCheckStatus(item.id)
    }
    render() {
        return (
            <tr key={this.props.item.id}>
                {/* 是否勾选 */}
                <td>
                    <input type="checkbox" checked={this.props.item.isChecked ? 'checked' : ''} onChange={this.handleChange} data-id={this.props.item.id} />
                    {/* 显示的名称 */}
                </td>
                <td><span>{this.props.item.name}</span></td>
                {/* 显示的价格 */}
                <td><span>¥{this.props.item.price}</span></td>
                <td>
                    {/* -按钮 */}
                    <button onClick={this.childReduce} data-id={this.props.item.id}>-</button>
                    {/* 显示数量 */}
                    <input type="text" value={this.props.item.count} disabled />
                    {/* +按钮 */}
                    <button onClick={this.childAdd} data-id={this.props.item.id}>+</button></td>
            </tr>
        )
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值