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

React动态路由传值失败,求助修正filter函数用法

解决React动态路由数据匹配问题

常见问题及修复步骤

1. 路由参数与数据ID类型不匹配

通过useParams()获取的路由id默认是字符串类型,如果你的data.json中商品ID是数字类型,直接用===匹配会完全失败。

修复方式:将路由参数转为数字,统一匹配类型:

import { useParams } from 'react-router-dom';
import data from './data.json';

function Products() {
  const { id } = useParams();
  // 把字符串id转为数字类型
  const product = data.filter(item => item.id === parseInt(id))[0];
  
  if (!product) return <div>商品不存在</div>;
  
  return (
    <div>
      <h1>{product.name}</h1>
      <p>{product.description}</p>
    </div>
  );
}

2. 用find替代filter更高效

filter会返回所有匹配项的数组,而我们只需要单个商品,用find直接返回第一个匹配元素,更贴合需求:

const product = data.find(item => item.id === Number(id));

3. 确认卡片跳转的路由参数正确

检查Cards.jsx中的跳转链接是否正确传递了商品ID:

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

function Cards() {
  return (
    <div className="card-list">
      {data.map(item => (
        <Link key={item.id} to={`/products/${item.id}`}>
          <div className="card">
            <h3>{item.name}</h3>
            <img src={item.image} alt={item.name} />
          </div>
        </Link>
      ))}
    </div>
  );
}

4. 增加商品不存在的边界处理

当匹配不到对应商品时,提前返回提示,避免页面报错:

if (!product) {
  return <div className="not-found">该商品不存在或已下架</div>;
}

完整修改后的Products.jsx示例

import { useParams } from 'react-router-dom';
import data from './data.json';

export default function Products() {
  const { id } = useParams();
  // 统一类型并查找单个商品
  const product = data.find(item => item.id === Number(id));

  if (!product) {
    return <div>商品不存在</div>;
  }

  return (
    <div className="product-detail">
      <h1>{product.title}</h1>
      <img src={product.image} alt={product.title} />
      <p>{product.description}</p>
      <p>价格: ${product.price}</p>
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:00:41