React--简易购物车

复制代码
  1 import React, { Component, Fragment } from "react";
  2 
  3 export default class Cart extends Component {
  4   constructor() {
  5     super();
  6     this.state = {
  7       obj: [
  8         { name: "红烧茄子", price: 12, num: 0, bool: false },
  9         { name: "鱼香肉丝", price: 12, num: 0, bool: false },
 10         { name: "宫保鸡丁", price: 12, num: 0, bool: false },
 11         { name: "佛跳墙", price: 12, num: 0, bool: false },
 12         { name: "叉烧饭", price: 12, num: 0, bool: false },
 13         { name: "椒盐蘑菇", price: 12, num: 0, bool: false },
 14       ],
 15       total: 0,
 16     };
 17   }
 18   //渲染页面
 19   showList = () => {
 20     return this.state.obj.map((v, i) => (
 21       <tr key={i}>
 22         <td>
 23           <input
 24             type="checkbox"
 25             className="check"
 26             onChange={this.checkOneCart.bind(this, i)}
 27           />
 28         </td>
 29         <td>{v.name}</td>
 30         <td>{v.price}</td>
 31         <td>
 32           <button onClick={this.reduce.bind(this, i)}>-</button>
 33           <span>{v.num}</span>
 34           <button onClick={this.add.bind(this, i)}>+</button>
 35         </td>
 36         <td>{v.price * v.num}</td>
 37         <td>
 38           <button onClick={this.del.bind(this, i)}>删除</button>
 39         </td>
 40       </tr>
 41     ));
 42   };
 43   //单选框功能,全部选中之后全选按钮自动亮起
 44   checkOneCart = (i) => {
 45     let newarr = this.state.obj;
 46     newarr[i].bool = !newarr[i].bool;
 47 
 48     var checkall = document.getElementById("allcheck");
 49     //查找newarr里面是否有bool===false的,如果有,返回true,再将非true的状态赋值给全选框的选中状态
 50     checkall.checked = !newarr.some((v) => {
 51       return v.bool === false;
 52     });
 53     this.setState(
 54       {
 55         obj: newarr,
 56       },
 57       () => {
 58         this.total();
 59       }
 60     );
 61   };
 62   //全选框功能
 63   checkAllCart = () => {
 64     var checkall = document.getElementById("allcheck");
 65     let newarr = this.state.obj;
 66     newarr.forEach((v) => {
 67       v.bool = checkall.checked;
 68     });
 69     this.setState(
 70       {
 71         obj: newarr,
 72       },
 73       () => {
 74         var check = document.getElementsByClassName("check");
 75         this.state.obj.forEach((v, i) => {
 76           check[i].checked = this.state.obj[i].bool;
 77         });
 78         this.total();
 79       }
 80     );
 81   };
 82   //添加商品数量
 83   add = (i) => {
 84     let newarr = this.state.obj;
 85     newarr[i].num++;
 86     this.setState(
 87       {
 88         obj: newarr,
 89       },
 90       () => {
 91         this.total();
 92       }
 93     );
 94   };
 95   //减少商品数量
 96   reduce = (i) => {
 97     let newarr = this.state.obj;
 98     if (newarr[i].num > 0) {
 99       newarr[i].num--;
100       this.setState(
101         {
102           obj: newarr,
103         },
104         () => {
105           this.total();
106         }
107       );
108     }
109   };
110   //删除商品
111   del(i) {
112     let newarr = this.state.obj;
113     newarr.splice(i, 1);
114     this.setState(
115       {
116         obj: newarr,
117       },
118       () => {
119         var check = document.getElementsByClassName("check");
120         this.state.obj.forEach((v, i) => {
121           check[i].checked = this.state.obj[i].bool;
122         });
123         this.total();
124       }
125     );
126   }
127   //计算总金额
128   total() {
129     var check = document.getElementsByClassName("check");
130     let sum = 0;
131     for (let i = 0; i < check.length; i++) {
132       if (check[i].checked) {
133         sum +=
134           check[i].parentNode.nextElementSibling.nextElementSibling
135             .nextElementSibling.nextElementSibling.innerHTML / 1;
136       }
137     }
138     this.setState({
139       total: sum,
140     });
141   }
142   render() {
143     return (
144       <Fragment>
145         <table border="1">
146           <thead>
147             <tr>
148               <td>
149                 <input
150                   type="checkbox"
151                   id="allcheck"
152                   onChange={this.checkAllCart}
153                 />
154               </td>
155               <td>商品名称</td>
156               <td>单价</td>
157               <td>数量</td>
158               <td>小计</td>
159               <td>删除</td>
160             </tr>
161           </thead>
162           <tbody>
163             {/* 如果没有商品,显示暂无菜品,如果有,正常显示列表 */}
164             {this.state.obj.length === 0 ? (
165               <tr>
166                 <td colSpan="6">暂无菜品</td>
167               </tr>
168             ) : (
169               <>{this.showList()}</>
170             )}
171           </tbody>
172           <tfoot>
173             <tr>
174               <td colSpan="6">总计:{this.state.total}</td>
175             </tr>
176           </tfoot>
177         </table>
178       </Fragment>
179     );
180   }
181 }
复制代码

 

posted @   sprite692  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示