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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现