React Router从v5升级到v6之后,路由系统的写法发生了不少变化,很多老项目的代码直接迁移过来就会出现Route组件配置了却不渲染内容的情况,页面一片空白,控制台甚至没有明显报错。这篇文章把常见的原因逐一梳理出来,并给出对应的解决方案,帮助大家快速排查问题。

component属性写法过时导致Route什么都不显示
这是迁移到v6后最典型的一个问题。在v5中,我们习惯这样写路由:<Route path="/about" component={About} />。但在v6中,component属性已经被彻底移除,取而代之的是element属性,而且接收的不再是组件本身,而是React元素,也就是要写成JSX的形式。如果继续使用component属性,Route会静默忽略这个属性,渲染出一个空的路由,页面自然什么内容都没有,而且通常不会有任何警告提示,排查起来非常让人困惑。
正确的v6写法是把组件用JSX形式传给element属性,代码如下:
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from './pages/Home';
import About from './pages/About';
function App() {
return (
<BrowserRouter>
<Routes>
{/* v5写法已失效:<Route path="/about" component={About} /> */}
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
);
}
export default App;注意element接收的是<Home />这样的元素实例,而不是Home这个组件引用。如果写成element={Home},React会认为这是一个自定义组件但没有返回合法内容,同样会导致渲染失败。这一点和v5的component用法在书写细节上有明显区别,迁移时需要格外小心。
另外还要注意,v6中所有Route必须包裹在Routes组件内部,Routes会根据当前URL智能匹配最优的那一个路由。如果在Routes外面直接裸写Route,或者忘了引入Routes组件,路由同样不会渲染。这一点是v6相对v5的Switch的变化,名字变了,但作用类似,只是匹配逻辑更智能了。
嵌套路由忘记使用Outlet导致子路由内容无法显示
v6对嵌套路由的支持非常好,支持相对路径写法和路径自动拼接,但如果父路由组件中没有渲染Outlet组件,子路由的内容就永远不会出现。这是v6嵌套路由不渲染的第二大原因。所谓Outlet,可以理解为一个占位符,父路由组件渲染完成后,子路由匹配到的组件会被填充到Outlet所在的位置。如果父组件里压根没有写Outlet,子路由组件就无处安放,表现就是URL变了但页面内容纹丝不动。
下面是一个标准的嵌套路由示例,父组件Layout中必须包含Outlet:
import { Routes, Route, Outlet, Link } from 'react-router-dom';
function Layout() {
return (
<div>
<nav>
<Link to="/dashboard">仪表盘</Link>
<Link to="/dashboard/settings">设置</Link>
</nav>
{/* 子路由内容渲染在这里,缺少Outlet则子页面空白 */}
<Outlet />
</div>
);
}
function App() {
return (
<Routes>
<Route path="/dashboard" element={<Layout />}>
<Route index element={<h3>仪表盘首页</h3>} />
<Route path="settings" element={<h3>设置页面</h3>} />
</Route>
<Routes>
);
}上面代码中的index属性值得专门说一说。它表示索引路由,即当URL精确匹配父路由路径时渲染的默认子内容。如果没有设置index路由,访问/dashboard时Outlet位置会是空的,很多人误以为是渲染出了问题,其实只是没有为这个路径配置默认子路由。
还要提醒的是子路由的path不要以斜杠开头。v6中嵌套子路由的路径是相对父路由自动拼接的,如果写成path="/settings",React Router会把它当作绝对路径处理,可能导致匹配不上。正确的写法是path="settings"。一旦路径拼接错误,路由匹配失败,Route自然不会渲染任何内容。
BrowserRouter缺失、路径匹配失败等其他排查思路
除了上面两个高频原因,还有一些因素会导致Route不渲染。首先是BrowserRouter缺失或者位置不对。useRoutes、Routes等所有路由相关组件都必须在BrowserRouter的内部才能工作。如果直接在入口文件使用Routes而没有用BrowserRouter包裹,控制台通常会抛出错误提示,提示缺少Router上下文,此时所有路由都会渲染失败。
// main.jsx 入口文件,Router必须包裹在最外层
import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom';
import App from './App';
ReactDOM.createRoot(document.getElementById('root')).render(
<BrowserRouter>
<App />
</BrowserRouter>
);其次是路径匹配的细节问题。v6的path匹配是严格区分大小写的,并且要求路径完全一致或符合通配规则。如果访问的URL与配置的path对不上,Routes会匹配不到任何路由,导致空白。建议在Routes的最后添加一个通配路由作为兜底,例如<Route path="*" element={<NotFound />} />,这样任何未匹配的路径都会显示404页面,方便我们立即发现匹配失败的问题,而不是面对一片空白无从下手。
还有一种情况是使用了Redirect组件。v5中的Redirect在v6里被移除了,需要改用Navigate组件。如果在代码中引用了一个不存在的Redirect组件,轻则报错重则导致整个路由树渲染失败。对应的写法是把<Redirect to="/home" />改成<Navigate to="/home" replace />。
最后总结一个通用的排查流程:第一步确认Route写在Routes内部,且Routes被BrowserRouter包裹;第二步检查是否使用element属性并以JSX形式传入组件;第三步检查嵌套路由的父组件中是否有Outlet,子路径是否误加了开头的斜杠;第四步添加通配的404路由验证路径匹配是否成功。按照这个顺序逐项检查,绝大多数Route不渲染的问题都能在几分钟内定位并解决。
React Router v6Route组件路由不渲染修改时间:2026-09-01 03:25:27