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 }