/** * 购物车 */ import { useMemo, useState, useCallback } from 'react' const initList = [ { id: 1, name: '算法导论', publish: '2006-9', price: 85, count: 1 }, { id: 2, name: 'UNIX编程艺术', publish: '2016-2', price: 39, count: 1 }, { id: 3, name: '编程珠玑', publish: '2020-4', price: 189, count: 1 }, { id: 4, name: '代码大全', publish: '2013-8', price: 299, count: 1 }, ] export default function Shop() { const [books, setBooks] = useState(initList) // ★ useMemo:仅 books 变化时重新计算总价 const total = useMemo(() => { return books.reduce((sum, item) => sum + item.count * item.price, 0) }, [books]) // ★ 数量 +1(不可变更新) const handleAdd = useCallback((id) => { setBooks(prev => prev.map(b => b.id === id ? { ...b, count: b.count + 1 } : b) ) }, []) // ★ 数量 -1(最小为 1) const handleReduce = useCallback((id) => { setBooks(prev => prev.map(b => b.id === id && b.count > 1 ? { ...b, count: b.count - 1 } : b ) ) }, []) // ★ 移除 const handleRemove = useCallback((id) => { if (!window.confirm('确定从购物车中移除当前书籍么')) return setBooks(prev => prev.filter(item => item.id !== id)) }, []) return (
| # | 书籍名称 | 出版日期 | 价格 | 购买数量 | 操作 |
|---|---|---|---|---|---|
| {index + 1} | {item.name} | {item.publish} | ¥{item.price} | {item.count} |