界面
代码
<!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>