react 初学增删改查购物车案例

界面

在这里插入图片描述

代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>react-购物车案例</title><script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.production.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.24.4/babel.min.js"></script><style>#root {height: 100vh;display: flex;align-items: center;justify-content: center;}table {border-collapse: collapse;text-align: center;}thead {background-color: #f2f2f2;}td,th {padding: 10px 16px;border: 1px solid #aaa;}.search {margin-bottom: 10px;}.count {display: inline-block;width: 50px;}</style></head><body><div id="root"></div><script type="text/babel">const data = [{id: 1,name: '《算法导论》',date: '2006-9',price: 85.0,count: 1,},{id: 2,name: '《UNIX编程艺术》',date: '2006-2',price: 59.0,count: 1,},{id: 3,name: '《编程珠玑》',date: '2008-10',price: 39.0,count: 1,},{id: 4,name: '《代码大全》',date: '2006-3',price: 128.0,count: 1,},];class App extends React.Component {constructor() {super();this.state = {tableHead: ['编号','书籍名称','出版日期','价格','购买数量','操作',],booksList: data,searchName: '',};}delBook(index) {const booksList = [...this.state.booksList];booksList.splice(index, 1);this.setState({booksList,});}changeBookCount(index, step) {const booksList = [...this.state.booksList];booksList[index].count += step;this.setState({booksList,});}getTotalPrice() {const totalPrice = this.state.booksList.reduce((pre, item) => {return pre + item.price * item.count;}, 0);return totalPrice;}searchBook(name) {if (name === '') {alert('请输入书籍名称');return;}const booksList = [...this.state.booksList];const searchList = booksList.filter((item) => {return item.name.includes(name);});this.setState({booksList: searchList,});}clearSearch() {this.setState({searchName: '',booksList: data,});}addBook() {const name = prompt('请输入新增的书籍名字');const book = {id: this.state.booksList.length + 1,name: name,date: new Date().toLocaleDateString(),price: Math.floor(Math.random() * 100),count: 1,};data.push(book);this.setState({booksList: data,});}render() {const { tableHead, booksList, searchName } = this.state;return (<div><div className="search"><span>书籍搜索:</span><inputtype="text"placeholder="请输入书籍名称"value={searchName}onChange={(event) => {this.setState({searchName: event.target.value,});}}onKeyUp={(event) => {if (event.keyCode === 13) {this.searchBook(searchName);}}}/><button onClick={() => this.searchBook(searchName)}>搜索</button><button onClick={() => this.clearSearch()}>清空</button><button onClick={() => this.addBook()}>新增书籍</button></div><table><thead><tr>{tableHead.map((item, index) => {return <th key={index}>{item}</th>;})}</tr></thead><tbody>{booksList.map((item, index) => {return (<tr><td>{item.id}</td><td>{item.name}</td><td>{item.date}</td><td>{item.price}</td><td><buttondisabled={item.count <= 1}onClick={() => this.changeBookCount(index, -1)}>-</button><span className="count">{item.count}</span><buttononClick={() => this.changeBookCount(index, 1)}>+</button></td><td><button onClick={() => this.delBook(index)}>删除</button></td></tr>);})}</tbody>{booksList.length === 0 && (<h2>{searchName ? '没有找到相关书籍~' : '没有书籍了~'}</h2>)}</table><h2>总价格:{this.getTotalPrice()}</h2></div>);}}const root = ReactDOM.createRoot(document.getElementById('root'));root.render(<App />);</script></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/615302.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ERA拓展之旅:2024香港Web3峰会聚焦全球Web3发展

2024年香港Web3大型峰会是一次令人难忘的体验。这次峰会吸引了来自世界各地的Web3爱好者和从业者齐聚一堂&#xff0c;共同探讨着Web3的未来发展方向与机遇。在这个热情洋溢的氛围中&#xff0c;展现了对Web3的热情&#xff0c;分享彼此的见解和理念&#xff0c;探讨了未来的行…

在vue和 js 、ts 数据中使用 vue-i18n,切换语言环境时,标签文本实时变化

我的项目需要显示两种语言(中文和英文)&#xff0c;并且我想要切换语言时&#xff0c;页面语言环境会随之改变&#xff0c;目前发现&#xff0c;只能在vue中使用$t(‘’)的方式使用&#xff0c;但是这种方式只能在vue中使用&#xff0c;而我的菜单文件是定义在js中&#xff0c;…

O2OA开发平台如何查看数据表结构?

在访问后端api地址&#xff0c;页面最下方有列示平台的各个服务&#xff0c;点击进入可查看具体的表内容 后端api地址&#xff1a; http://{hostIP}/x_program_center/jest/list.html 其中&#xff1a;{hostIP}为中心服务器所在域名或者IP地址 如下图&#xff1a;

C++高级特性:万能引用、引用折叠与完美转发(七)

1、万能引用与引用折叠 1.1、普通引用 之前的学习中学习了左值、右值、左值引用、右值引用、常引用等&#xff0c;但是很可惜它们都必须搭配固定的类型导致它们受到一些限制 void test1() {int a 1, b 2;int& left_ref_var a; // int&& right_ref_var a; …

MuseV:不限视频时长的AI视频生成工具

在不久前 OpenAI Sora 以其优秀且惊人的视频生成效果迅速走红&#xff0c;更是在一众文生视频模型中脱颖而出&#xff0c;成为了文生视频领域的领头羊。 同时它也推动了行业内文生视频技术的发展。今天小编为大家分享一款新开源的文生视频项目MuseV&#xff0c;据说可以生成不…

书生·浦语大模型实战营之XTuner 微调个人小助手认知

书生浦语大模型实战营之XTuner 微调个人小助手认知 在本节课中讲一步步带领大家体验如何利用 XTuner 完成个人小助手的微调&#xff01; 为了能够让大家更加快速的上手并看到微调前后对比的效果&#xff0c; 用 QLoRA 的方式来微调一个自己的小助手&#xff01; 可以通过下面两…

stm32 之SPI通信协议

本文为大家介绍 SPI 通信协议的基础知识。 文章目录 前言一、SPI协议的概念二、SPI总线架构三、SPI通讯时序1. 起始&#xff0c;停止 信号2.CPOL&#xff08;时钟极性&#xff09;/CPHA&#xff08;时钟相位&#xff09; 四&#xff0c; I2C 总线 和SPI 总线比较相同点&#xf…

gym界面修改

资料&#xff1a;https://blog.csdn.net/weixin_46178278/article/details/135962782 在gym环境中使用mujoco的时候&#xff0c;有一个很难受的地方&#xff0c;界面上没有实时显示动作空间和状态空间状态的地方。 gym自己原始带的环境是用pygame画的图&#xff0c;所以在定义…

【PG-1】PostgreSQL体系结构概述

1. PostgreSQL体系结构概述 代码结构 其中&#xff0c;backend是后端核心代码&#xff0c;包括右边的几个dir: access&#xff1a;处理数据访问方法和索引的代码。 bootstrap&#xff1a;数据库初始化相关的代码。 catalog&#xff1a;系统目录&#xff08;如表和索引的元数据…

Errors were encountered while processing: /var/cuda-repo-ubuntu2004-12-0-local

问题描述 mac10-SYS-7048GR-TR:~$ sudo apt-get -y install cuda Reading package lists... Done Building dependency tree Reading state information... Done cuda is already the newest version (12.0.0-1). You might want to run apt --fix-broken install to co…

区块链游戏:探索未来的可能性与挑战

区块链游戏是一种将区块链技术应用于游戏领域的创新产品&#xff0c;它为游戏行业带来了全新的模式和可能性。本文将深入探讨区块链游戏的优点、挑战和未来趋势&#xff0c;帮助读者了解这一新兴领域。 一、区块链游戏的优点 1. 公平性&#xff1a;区块链技术保证了游戏中的物…

应急响应-CS流量分析心跳指令特征提取

知识点 战后-流量分析-CS 一、演示案例-流量分析-CS-HTTP/S协议-基础特征&源码特征 HTTP 1、基础特征&#xff1a;解密心跳请求 https://blog.didierstevens.com/didier-stevens-suite/ python 1768.py xxxx.vir2、请求特征&#xff1a; URL路径 下发指令 UA头&…