You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+React Router Dom实现电商单产品详情页跳转与展示

解决React Router Dom传递产品ID及详情页数据渲染问题

1. 修正路由配置(解决参数不匹配)

先确保路由里正确定义带参数的路径,参数名要统一(比如用productId),以React Router v6为例:

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import ProductList from './components/ProductList';
import ProductDetail from './components/ProductDetail';

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<ProductList />} />
        {/* 定义带产品ID参数的详情页路由 */}
        <Route path="/product/:productId" element={<ProductDetail />} />
      </Routes>
    </Router>
  );
}

export default App;

注意:路径里的参数名(:productId)要和后续详情页获取的参数名完全一致,不能出现拼写错误。

2. 产品卡片跳转时传递ID

在产品列表组件中,用Link组件将产品ID拼接到跳转路径中:

import { Link } from 'react-router-dom';

function ProductCard({ product }) {
  return (
    <div className="product-card">
      <h3>{product.name}</h3>
      <p>${product.price}</p>
      {/* 直接拼接产品ID到详情页路径 */}
      <Link to={`/product/${product.id}`}>查看详情</Link>
    </div>
  );
}

如果你的产品ID字段不是id(比如productId),要替换成对应字段名,避免传错值。

3. 详情页获取参数并渲染数据(修复查询逻辑)

用useParams钩子获取路由参数,同时处理参数类型转换、数据查询失败等异常情况:

import { useParams } from 'react-router-dom';
import { useEffect, useState } from 'react';

// 示例产品数据,实际项目可替换为API请求
const productData = [
  { id: 1, name: '纯棉T恤', price: 29.99, desc: '舒适透气,多色可选' },
  { id: 2, name: '修身牛仔裤', price: 59.99, desc: '弹力面料,显瘦百搭' }
];

function ProductDetail() {
  const { productId } = useParams();
  const [product, setProduct] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    // 路由参数默认是字符串,若产品ID为数字需转类型
    const targetId = parseInt(productId, 10);
    if (isNaN(targetId)) {
      setError('无效的产品ID');
      setLoading(false);
      return;
    }

    // 模拟数据查询,实际项目替换为fetch/axios请求
    const getProduct = async () => {
      try {
        const matchedProduct = productData.find(item => item.id === targetId);
        if (!matchedProduct) {
          setError('未找到该产品');
        } else {
          setProduct(matchedProduct);
        }
      } catch (err) {
        setError('获取产品数据失败');
      } finally {
        setLoading(false);
      }
    };

    getProduct();
  }, [productId]);

  // 状态渲染逻辑
  if (loading) return <div>加载中...</div>;
  if (error) return <div className="error">{error}</div>;
  if (!product) return <div>产品不存在</div>;

  return (
    <div className="product-detail">
      <h1>{product.name}</h1>
      <p className="price">${product.price}</p>
      <p className="desc">{product.desc}</p>
    </div>
  );
}

export default ProductDetail;

常见错误排查

  • 参数名不匹配:路由里写:id但详情页取productId,导致参数为空
  • 类型不匹配:路由参数是字符串,产品ID是数字,未转类型导致find匹配失败
  • 路径拼写错误:卡片跳转路径是/products/${id},但路由配置是/product/:productId,多了s导致404
  • 依赖遗漏:useEffect依赖数组没加productId,参数变化时不重新查询数据

内容的提问来源于stack exchange,提问作者shruti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:55:19