
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」问题,并构建健壮、可预测的客户端路由行为。