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

React中如何将选中商品的id从Product.js传递到ProductScreen组件

解决步骤

1. 修改Product.js组件跳转逻辑

你原来的Link放在map循环外层是错误的,需要给每个商品单独配置带对应ID的跳转链接,同时把原生a标签替换为React Router的Link避免页面全量刷新:

import React from 'react';
import { Link } from 'react-router-dom'; // 确保已导入Link组件
import data from './data';
import Rating from './Rating'; // 按你实际文件路径调整

function Product() {
return (
<div className="product">
    <div className="row center">
        {
             data.products.map(product=>(
                <div key={product._id} className="card card-deck">
                    <div className="product_image">
                        {/* 替换原生a标签为Link,路径匹配路由定义的参数格式 */}
                        <Link to={`/productScreen/${product._id}`}>
                            <img className="image" src={product.image} alt={product.name} style={{textAlign:"center"}}/>
                        </Link>
                    </div>
                    <div className="product_detail">
                        <Link to={`/productScreen/${product._id}`}>
                            <h4>{product.brand}</h4>
                            <p>{product.description}</p>
                        </Link>
                        <div className="product_rating_Page">
                            <Rating rating={product.rating} numReviews={product.numReviews}/>
                        </div>
                    </div>
                </div>
            ))
        }
    </div>
</div>
)}
export default Product;

2. 修正ProductScreen组件的参数获取逻辑

你原来的props解构写法错误,推荐用函数组件专属的useParams hook获取路由参数,写法更简洁:

import React from 'react';
import { useParams } from 'react-router-dom'; // 导入useParams钩子
import data from './data';
import Rating from './Rating';
import CurrencyFormat from 'react-currency-format'; // 按你实际文件路径调整

function ProductScreen() {
  const { id } = useParams(); // 直接提取路由中绑定的id参数
  const product = data.products.find(x => x._id === id);

  if(!product){
    return <div>Product Not Found</div>
  }

  return (
    <div className="productScreen">
      <div className="row">
        <div className="col-2">
          <img className="large" src={product.image} alt={product.name}/>
        </div>
        <div className="col-1">
          <ul>
            <li>
              <h1>{product.brand}</h1>
            </li>
            <li>
              <Rating rating={product.rating} numReviews={product.numReviews}/>
            </li>
            <li>
              <CurrencyFormat
                  renderText={(value) => (
                        <h5>{value}</h5>
                  )}
                  decimalScale={2}
                  value={product.price}
                  displayType={"text"}
                  thousandSeparator={true}
                  prefix={"$"}
              />
            </li>
            <li>
              <p>{product.description}</p>
            </li>
          </ul>
        </div>
      </div>
    </div>
)}
export default ProductScreen;

如果你想继续用props的方式获取参数,只需要修正参数解构即可:

// 去掉props外层的解构括号,直接接收props
function ProductScreen(props) {
  const product = data.products.find(x => x._id === props.match.params.id);
  // 其余逻辑不变
}

注意事项

  • 你App.js中定义的路由格式是/productScreen/:id属于路径参数,不要写成query参数格式/productScreen?id=xxx,否则路由匹配失败也拿不到对应ID
  • 不要混用原生a标签和Link组件,Link是React Router封装的组件,不会触发页面全量刷新,符合单页应用的交互逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:15:03