
react router v6 中因 `link` 使用相对路径(如 `"products/123"`)导致路由无法匹配,实际跳转为 `/products/products/123`,应统一改为绝对路径(如 `"/products/123"`)以确保正确导航。
在 React Router v6 中, 的路径解析规则与 v5 有本质区别:它默认按相对路径解析,而非从根路径开始。这意味着当用户当前位于 /products 页面时,若 被点击,Router 将拼接为 /products/products/123 —— 这一路径显然未在
✅ 正确做法:始终使用绝对路径
所有 to 属性必须以 / 开头,明确指定从根路径出发的完整路径:
// ❌ 错误:相对路径 → 解析为 /products/products/123
<Link to={`products/${product.id}`} />
// ✅ 正确:绝对路径 → 解析为 /products/123
<Link to={`/products/${product.id}`} />需检查项目中所有 组件,包括 ProductCard.jsx 中的两处链接(图片容器和标题):
// ProductCard.jsx(修正后)
export const ProductCard = ({ product }) => {
return (
<div className="m-3 max-w-sm ...">
{/* ✅ 修复:添加前导斜杠 */}
<Link to={`/products/${product.id}`} className="relative">
{product.best_seller && (
<span className="absolute top-4 left-2 px-2 bg-orange-500 ...">Best Seller</span>
)}
@@##@@
</Link>
{/* ✅ 同样修复此处 */}
<Link to={`/products/${product.id}`}>
<h5 className="mb-2 text-2xl font-bold ...">{product.name}</h5>
</Link>
{/* 其余代码保持不变 */}
<div className="p-5">
<p className="mb-3 ...">{product.overview}</p>
<div className="flex items-center my-2">
<Rating rating={product.rating} />
</div>
<p className="flex justify-between items-center">
<span className="text-2xl dark:text-gray-200">${product.price}</span>
<button className="...">Add To Cart</button>
</p>
</div>
</div>
);
};⚠️ 注意事项与最佳实践
必须被 :确保应用顶层已用 BrowserRouter(或 Router)包裹 AllRoutes,否则路由系统不生效;包裹 路径顺序无关紧要:v6 中
匹配基于最长前缀优先(非顺序),但建议将动态路由(如 /products/:id)置于静态路由(如 /products)之后,避免意外捕获; 参数获取需用 useParams():ProductDetail.jsx 中已正确使用,无需修改;
服务端路由一致性:确保后端 API 路径(如 fetch('/products/123'))与前端路由路径命名逻辑一致,提升可维护性;
-
开发期调试技巧:在 ProductDetail 组件中临时打印 useParams() 结果,确认 id 是否成功注入:
const { id } = useParams(); console.log('Current product ID:', id); // 若为 undefined,说明路由未命中
✅ 验证步骤
- 修改所有 Link to 为绝对路径;
- 清除浏览器缓存或硬刷新页面;
- 访问 /products,点击任一商品卡片;
- 检查地址栏是否变为 /products/123,且 ProductDetail 正常渲染;
- 手动输入 /products/999(假设该 ID 不存在),确认 fetch 报错逻辑或 404 UI 可正常触发。
遵循这一规范,即可彻底解决「No routes found」问题,并构建健壮、可预测的客户端路由行为。











