React Router v6的发布带来了许多重要变化,其中路由权限控制的实现方式发生了显著改变。在v5中,我们可以通过<Route>组件的component或render属性来实现路由守卫,但在v6中,这种直接方式已被废弃。
核心变化
v6引入了useNavigate和useLocation钩子,并通过element属性来渲染组件。要实现权限控制,我们需要创建一个自定义的路由包装器组件。
问题场景
在升级过程中,我遇到一个典型问题:原v5代码中使用<Route component={ProtectedComponent} />进行权限验证,在v6中会报错。正确的做法是将权限检查逻辑封装到路由组件内部。
解决方案
// v6正确实现方式
function ProtectedRoute({ children }) {
const navigate = useNavigate();
const location = useLocation();
useEffect(() => {
// 权限检查逻辑
if (!isAuthenticated()) {
navigate('/login', {
replace: true,
state: { from: location }
});
}
}, [navigate, location]);
return isAuthenticated() ? children : null;
}
// 使用方式
<Routes>
<Route path="/dashboard" element={
<ProtectedRoute>
<Dashboard />
</ProtectedRoute>
} />
</Routes>
踩坑总结
- 不能直接在路由层级使用
<Route>的component属性进行权限控制 - 需要将权限检查逻辑封装到独立组件中
- 使用
useNavigate和useLocation进行导航控制更灵活 - 注意在
useEffect中进行权限验证,避免无限重定向
这个变化虽然增加了实现复杂度,但提供了更细粒度的路由控制能力。

讨论