import React, { useState } from “react”; // 简单的单文件电商 Starter 组件(可直接放在 Next.js 或 CRA 项目中) // 要求:Tailwind CSS 已配置。 const SAMPLE_PRODUCTS = [ { id: “p1”, title: “经典纯棉T恤”, price: 79, image: “https://via.placeholder.com/320×240?text=T-shirt” }, { id: “p2”, title: “轻量运动鞋”, price: 299, image: “https://via.placeholder.com/320×240?text=Shoes” }, { id: “p3”, title: “极简双肩包”, price: 199, image: “https://via.placeholder.com/320×240?text=Backpack” }, { id: “p4”, title: “保温水杯”, price: 89, image: “https://via.placeholder.com/320×240?text=Bottle” }, ]; function formatPrice(cny) { return `¥${cny.toFixed(2)}`; } export default function EcommerceStarter() { const [products] = useState(SAMPLE_PRODUCTS); const [cart, setCart] = useState([]); const [isCartOpen, setCartOpen] = useState(false); function addToCart(product) { setCart((c) => { const idx = c.findIndex((it) => it.id === product.id); if (idx === -1) return […c, { …product, qty: 1 }]; const next = c.slice(); next[idx] = { …next[idx], qty: next[idx].qty + 1 }; return next; }); setCartOpen(true); } function updateQty(id, delta) { setCart((c) => c .map((it) => (it.id === id ? { …it, qty: Math.max(1, it.qty + delta) } : it)) .filter((it) => it.qty > 0) ); } function removeItem(id) { setCart((c) => c.filter((it) => it.id !== id)); } const subtotal = cart.reduce((s, it) => s + it.price * it.qty, 0); function checkout() { alert(`结账:共 ${cart.length} 件,合计 ${formatPrice(subtotal)}。\n\n(此处为演示)`); // TODO: 替换为真实支付流程 } return (

我的商店

热销商品

{products.map((p) => (
{p.title}

{p.title}

{formatPrice(p.price)}

))}

店铺介绍

这是一个演示用的电商前端 starter,功能包含商品展示、购物车管理、简单结账占位。 后端可以接入:商品 CMS、订单数据库、支付网关(Stripe / 支付宝 / 微信支付)、物流接口等。

{/* 购物车抽屉 */}
); }