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

React中为何用Routes替代Switch?Routes改写后页面消失如何修复?

为什么在React中使用Routes组件而非Switch组件?

虽然Switch能完成基础的路由匹配工作,但Routes是react-router-dom v6推出的新组件,相比Switch有不少核心优势:

  • 精确匹配更可靠:Switch采用前缀匹配规则,会返回第一个路径前缀匹配的路由,很容易出现比如/匹配所有路由的意外情况;而Routes默认是完全匹配,只有当路径完全一致时才会渲染对应的组件,避免不必要的匹配错误。
  • 嵌套路由更优雅:Routes配合Outlet组件可以轻松实现嵌套路由的布局复用,而Switch的嵌套写法需要多层嵌套Switch,代码冗余且维护性差。
  • 自动路由优先级:Routes会根据路由的具体程度自动排序优先级,比如静态路由/checkout会比带参数的/:id优先匹配,不用手动调整路由顺序;Switch则必须手动把精确匹配的路由放在前面,否则会被前缀匹配的路由拦截。
  • API更统一简洁:v6中Route组件不再混用component/render/children属性,统一使用element传入要渲染的组件,写法更一致,减少语法混淆。
  • 更好的懒加载支持:Routes可以无缝配合React.lazy和Suspense实现组件懒加载,在性能优化上更便捷。

正确转换你的路由代码(修复页面消失问题)

你的代码存在语法和逻辑错误,导致页面无法正常渲染,以下是修正后的代码:

import React from "react";
import Home from "./Home";
import Header from "./Header";

import { BrowserRouter as Router, Routes, Route } from "react-router-dom";

const App = () => {
  return (
    <Router>
      <div className="app">
        <Routes>
          {/* 结账页面:同时渲染Header和标题 */}
          <Route 
            path="/checkout" 
            element={
              <>
                <Header />
                <h1>I am a Checkout, Smash the like button</h1>
              </>
            } 
          />
          
          {/* 根路径:同时渲染Header和Home组件 */}
          <Route 
            path="/" 
            element={
              <>
                <Header />
                <Home />
              </>
            } 
          />
        </Routes>
      </div>
    </Router>
  );
};

export default App;

关键修改点说明:

  1. 修复语法错误:element属性需要传入合法的JSX元素,你之前写的element={Header/>}是语法错误,必须用<Header />包裹,多个组件要加片段(<>)或者容器元素。
  2. 调整路由层级:你之前把根路由/嵌套在/checkout路由内部,导致只有访问/checkout/时才会渲染,现在改为同级路由,确保根路径和结账路径各自独立匹配。
  3. 统一element写法:每个Route的element里包裹需要渲染的所有组件,确保对应路径下的内容都能正确展示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:20:39