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

React Router路由匹配失败,无法导航至Cart页面求助

React Router 导航至Cart页面时出现“No Router matched”错误排查

我在使用React Router时遇到了“No Router matched”错误,无法导航至Cart页面。尝试过使用useNavigate钩子和NavLink组件两种方式,将路径替换为/login时可正常跳转,已清理缓存、硬刷新并重启服务器,但问题依旧。

相关代码

App.js

import Login from './Auth/components/login/Login';
import { Route, BrowserRouter, Routes, Outlet } from 'react-router-dom';
import SignIn from './Auth/components/signin/Signin';
import Home from './Home/Home';
import Dogs from './pets/Dogs';
import Cats from './pets/Cats';
import Others from './pets/Others';
import Pets from './pets/Pets';
import { Header } from './ui/Header/Header';
import { ContextClickValue } from './context/ContextClick';
import Cart from './Auth/components/cart/Cart';


function App() {
  return (
    <>
      <BrowserRouter>
        <Routes>
          <Route path="/" element={<Home />} >
          </Route>
        </Routes>
        <Header />
        <Routes>
          <Route path="/login" element={<Login />}></Route>
          <Route path="/signin" element={<SignIn />}></Route>
          <Route path="/cart" element={<Cart />}></Route>
          <Route path="pets" element={< Outlet />}>
            <Route index element={<Pets />} />
            <Route path="dogs" element={<Dogs />} />
            <Route path="cats" element={<Cats />} />
            <Route path="others" element={<Others />} />
          </Route>
        </Routes>
      </BrowserRouter>
    </>
  );
}

export default App;

Header.js

import { menuItems } from "../../Home/MenuItems";
import MenuItemComponent from "./MenuItemComponent";
import HeaderStyles from "./Header.module.css";
import { ContextClick, ContextClickValue } from "../../context/ContextClick";
import AddShoppingCartIcon from '@mui/icons-material/AddShoppingCart';
import  {useSelector} from 'react-redux'
import { NavLink, useNavigate } from "react-router-dom";


export function Header() {
    const cart = useSelector(state => state.cart.cart)
    const  navigate = useNavigate()

    function navigateToCart(e){
         e.preventDefault()
        navigate('/cart')
    }
    let  total = 0;
    return (
        <section className={HeaderStyles.navbar}>
            <header>
                <h4 className={HeaderStyles.logo}>PETSHOP</h4>
                <nav>
                        <MenuItemComponent items={menuItems} />
                </nav>
            </header>
            <section style={{ float:'right',margin:30, color:'white'}}>
            <AddShoppingCartIcon  style={{cursor:'pointer'}} onClick={navigateToCart}/>
            {cart.forEach(item => {
                total += item.quantity
            })}
            <span>{total}</span>
            </section>
        </section>
    )
}

尝试过的NavLink写法

<NavLink to="/cart">
    <AddShoppingCartIcon style={{cursor:'pointer'}} />
    {cart.forEach(item => {
        total += item.quantity
    })}
</NavLink>  

问题现象

  • 尝试导航至Cart页面失败
  • 开发者工具显示无匹配路由,已清理缓存、硬刷新并重启服务器
  • 替换为/login路径可正常导航

问题原因及解决方法

问题出在使用了多个<Routes>组件。React Router v6中,<Routes>组件会独立执行路由匹配逻辑,仅渲染自身内部第一个匹配的路由。当导航到/cart时,第一个<Routes>只有/路径,无法匹配/cart,而第二个<Routes>的匹配结果不会生效,最终导致无匹配路由的错误。

解决方法是将所有路由合并到同一个<Routes>组件中,通过嵌套路由组织结构,让所有路由共享Header:

修改后的App.js代码:

import Login from './Auth/components/login/Login';
import { Route, BrowserRouter, Routes, Outlet } from 'react-router-dom';
import SignIn from './Auth/components/signin/Signin';
import Home from './Home/Home';
import Dogs from './pets/Dogs';
import Cats from './pets/Cats';
import Others from './pets/Others';
import Pets from './pets/Pets';
import { Header } from './ui/Header/Header';
import { ContextClickValue } from './context/ContextClick';
import Cart from './Auth/components/cart/Cart';


function App() {
  // 创建共享布局,包含Header和子路由出口
  const Layout = () => (
    <>
      <Header />
      <Outlet />
    </>
  );

  return (
    <BrowserRouter>
      <Routes>
        {/* 根路由使用共享布局,所有子路由自动继承Header */}
        <Route element={<Layout />}>
          <Route path="/" element={<Home />} />
          <Route path="/login" element={<Login />} />
          <Route path="/signin" element={<SignIn />} />
          <Route path="/cart" element={<Cart />} />
          <Route path="pets" element={<Outlet />}>
            <Route index element={<Pets />} />
            <Route path="dogs" element={<Dogs />} />
            <Route path="cats" element={<Cats />} />
            <Route path="others" element={<Others />} />
          </Route>
        </Route>
      </Routes>
    </BrowserRouter>
  );
}

export default App;

修改后,所有路由在同一个<Routes>中匹配,导航到/cart时就能正确找到对应路由并渲染Cart组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:20:37