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

React项目中PageNotFound组件放在路由底部仍全页面显示问题求助

问题原因

React Router v5 的 <Switch> 组件仅对它的直接子级 <Route> 或 <Redirect> 组件执行路径匹配逻辑。你的代码中把 <Container> 作为 <Switch> 的唯一直接子元素,<Switch> 无法识别 <Container> 内部嵌套的路由规则,访问任意路径都会直接渲染整个 <Container> 内容,因此所有页面都会显示最底部的 PageNotFound 组件。

同时你代码中管理员路由外层包裹的空标签 <></>(Fragment)也会干扰匹配逻辑,<Switch> 不会识别 Fragment 内部嵌套的路由。

修复方案

将 <Container> 移到 <Switch> 外层,同时调整管理员路由的包装方式,让所有 <Route>、<PrivateRoute> 成为 <Switch> 的直接子级即可:

<>
  <BrowserRouter>
    <>
      <div className="content-wrap">
        <div className="main-content">
          <Menu />
          <main className="main-pages">
            {/* Container 移到 Switch 外层 */}
            <Container>
              <Switch>
                {/* admin 路由调整为数组形式,避免Fragment干扰匹配,每个路由加唯一key */}
                {userInfo && userInfo.isAdmin && [
                  <PrivateRoute
                    key="admin-userlist"
                    path="/admin/userlist"
                    component={UserList}
                    exact
                  />,
                  <PrivateRoute
                    key="admin-userlist-page"
                    path="/admin/userlist/:pageNumber"
                    component={UserList}
                    exact
                  />,
                  <PrivateRoute
                    key="admin-user-edit"
                    path="/admin/user/:id/edit"
                    component={UserEdit}
                    exact
                  />,
                  <PrivateRoute
                    key="admin-user-create"
                    path="/admin/createuser"
                    component={UserCreate}
                  />,
                  <PrivateRoute
                    key="admin-user-contact"
                    path="/admin/user/:id/contact"
                    component={UserContact}
                    exact
                  />,
                  <PrivateRoute
                    key="admin-productlist"
                    path="/admin/productlist"
                    component={ProductList}
                    exact
                  />,
                  <PrivateRoute
                    key="admin-productlist-page"
                    path="/admin/productlist/:pageNumber"
                    component={ProductList}
                    exact
                  />,
                  <PrivateRoute
                    key="admin-product-edit"
                    path="/admin/product/:id/edit"
                    component={ProductEdit}
                    exact
                  />,
                  <PrivateRoute
                    key="admin-orderlist"
                    path="/admin/orderlist"
                    component={OrderList}
                    exact
                  />,
                  <PrivateRoute
                    key="admin-orderlist-page"
                    path="/admin/orderlist/:pageNumber"
                    component={OrderList}
                    exact
                  />
                ]}

                {/* private */}
                <PrivateRoute path="/profile" component={Profile} />
                <PrivateRoute path="/shipping" component={Shipping} />
                <PrivateRoute path="/payment" component={Payment} />
                <PrivateRoute path="/placeorder" component={PlaceOrder} />
                <PrivateRoute path="/order/:id" component={Order} />

                {/* public */}
                <Route path="/products/:id" component={ProductDetail} />
                <Route path="/about" component={About} />
                <Route path="/cart/:id?" component={Cart} />
                <Route path="/login" component={Login} />
                <Route path="/register" component={Register} />
                <Route exact path="/search/:word" component={Home} />
                <Route
                  exact
                  path="/search/:word/page/:pageNumber"
                  component={Home}
                />
                <Route exact path="/page/:pageNumber" component={Home}/>
                <Route exact path="/" component={Home} />
                <Route component={PageNotFound}/> 
              </Switch>
            </Container>
          </main>
        </div>
        <Footer />
      </div>
    </>
  </BrowserRouter>

修改后<Switch>会按从上到下的顺序匹配路由,匹配到第一个符合规则的路由就会停止渲染,只有所有路由都不匹配时才会显示PageNotFound组件。

内容的提问来源于stack exchange,提问作者benz-source

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:39:00