import {useEffect, useState} from "react"; import Taro, {useShareAppMessage, useDidShow} from '@tarojs/taro'; import { NavBar, Checkbox, Image, InputNumber, Button, Empty, Divider, ConfigProvider } from '@nutui/nutui-react-taro'; import {ArrowLeft, Del} from '@nutui/icons-react-taro'; import {View} from '@tarojs/components'; import {CartItem, useCart} from "@/hooks/useCart"; import './cart.scss'; function Cart() { const [statusBarHeight, setStatusBarHeight] = useState(0); const [selectedItems, setSelectedItems] = useState([]); const [isAllSelected, setIsAllSelected] = useState(false); const { cartItems, cartCount, updateQuantity, removeFromCart, clearCart, loadCartFromStorage } = useCart(); // InputNumber 主题配置 const customTheme = { nutuiInputnumberButtonWidth: '28px', nutuiInputnumberButtonHeight: '28px', nutuiInputnumberInputWidth: '40px', nutuiInputnumberInputHeight: '28px', nutuiInputnumberInputBorderRadius: '4px', nutuiInputnumberButtonBorderRadius: '4px', } useShareAppMessage(() => { return { title: '购物车 - 时里院子市集', success: function () { console.log('分享成功'); }, fail: function () { console.log('分享失败'); } }; }); // 页面显示时刷新购物车数据 useDidShow(() => { loadCartFromStorage(); }); useEffect(() => { Taro.getSystemInfo({ success: (res) => { setStatusBarHeight(res.statusBarHeight || 0); }, }); // 设置导航栏背景色 Taro.setNavigationBarColor({ backgroundColor: '#ffffff', frontColor: 'black', }); }, []); // 根据购物车状态动态设置页面背景色 useEffect(() => { if (cartItems.length === 0) { // 购物车为空时设置透明背景 Taro.setBackgroundColor({ backgroundColor: 'transparent' }); } else { // 有商品时恢复默认背景 Taro.setBackgroundColor({ backgroundColor: '#f5f5f5' }); } }, [cartItems.length]); // 处理单个商品选择 const handleItemSelect = (goodsId: number, checked: boolean) => { if (checked) { setSelectedItems([...selectedItems, goodsId]); } else { setSelectedItems(selectedItems.filter(id => id !== goodsId)); setIsAllSelected(false); } }; // 处理全选 const handleSelectAll = (checked: boolean) => { setIsAllSelected(checked); if (checked) { setSelectedItems(cartItems.map((item: CartItem) => item.goodsId)); } else { setSelectedItems([]); } }; // 更新商品数量 const handleQuantityChange = (goodsId: number, value: number) => { updateQuantity(goodsId, value); }; // 删除商品 const handleRemoveItem = (goodsId: number) => { Taro.showModal({ title: '确认删除', content: '确定要删除这个商品吗?', success: (res) => { if (res.confirm) { removeFromCart(goodsId); setSelectedItems(selectedItems.filter(id => id !== goodsId)); } } }); }; // 计算选中商品的总价 const getSelectedTotalPrice = () => { return cartItems .filter((item: CartItem) => selectedItems.includes(item.goodsId)) .reduce((total: number, item: CartItem) => total + (parseFloat(item.price) * item.quantity), 0) .toFixed(2); }; // 去结算 const handleCheckout = () => { if (selectedItems.length === 0) { Taro.showToast({ title: '请选择要结算的商品', icon: 'none' }); return; } // 获取选中的商品 const selectedCartItems = cartItems.filter((item: CartItem) => selectedItems.includes(item.goodsId) ); // 将选中的商品信息存储到本地,供结算页面使用 Taro.setStorageSync('checkout_items', JSON.stringify(selectedCartItems)); // 跳转到购物车结算页面 Taro.navigateTo({ url: '/shop/orderConfirmCart/index' }); }; // 检查是否全选 useEffect(() => { if (cartItems.length > 0 && selectedItems.length === cartItems.length) { setIsAllSelected(true); } else { setIsAllSelected(false); } }, [selectedItems, cartItems]); if (cartItems.length === 0) { return ( <> Taro.navigateBack()}/>} right={ cartItems.length > 0 && ( ) } > 购物车({cartCount}) {/* 垂直居中的空状态容器 */} Taro.switchTab({ url: '/pages/index/index' })} /> ) } return ( <> Taro.navigateBack()}/>} right={ cartItems.length > 0 && ( ) } > 购物车({cartCount}) {/* 购物车内容 */} {/* 商品列表 */} {cartItems.map((item: CartItem, index: number) => ( {/* 选择框 */} handleItemSelect(item.goodsId, checked)} /> {/* 商品图片 */} {/* 商品信息 */} {item.name} {item.price} handleQuantityChange(item.goodsId, Number(value))} /> handleRemoveItem(item.goodsId)}/> {index < cartItems.length - 1 && } ))} {/* 底部结算栏 */} 全选 已选 {selectedItems.length} 件 合计:
{getSelectedTotalPrice()}
{/* 底部安全区域占位 */}
); } export default Cart;