从v5到v6升级:React Router路由守卫实现方式大不同

Adam722 +0/-0 0 0 正常 2025-12-24T07:01:19 React Router

从v5到v6升级:React Router路由守卫实现方式大不同

React Router v6的发布带来了许多重大变化,其中最引人注目的莫过于路由守卫机制的重构。相比v5的Route组件配合componentrender属性,v6彻底放弃了传统的路由组件化思路,转而采用更加灵活的useRoutesNavigate API。

核心变化

在v5中,我们通过以下方式实现路由守卫:

const PrivateRoute = ({ component: Component, ...rest }) => (
  <Route {...rest} render={(props) => (
    isAuthenticated ? (
      <Component {...props} />
    ) : (
      <Redirect to="/login" />
    )
  )} />
);

而v6中,我们不能再直接在路由配置中使用component属性。相反,我们需要利用useRoutes Hook或者创建自定义的ProtectedRoute组件。

v6实现方案

方案一:自定义ProtectedRoute组件

import { Navigate } from 'react-router-dom';
import { useAuth } from './authContext';

const ProtectedRoute = ({ children }) => {
  const { isAuthenticated } = useAuth();
  
  if (!isAuthenticated) {
    return <Navigate to="/login" replace />;
  }
  
  return children;
};

// 使用方式
<Routes>
  <Route path="/dashboard" element={
    <ProtectedRoute>
      <Dashboard />
    </ProtectedRoute>
  } />
</Routes>

方案二:使用useRoutes API

import { useRoutes, Navigate } from 'react-router-dom';

function AppRoutes() {
  const routes = useRoutes([
    {
      path: '/',
      element: <Home />
    },
    {
      path: '/dashboard',
      element: (
        <ProtectedRoute>
          <Dashboard />
        </ProtectedRoute>
      )
    }
  ]);
  
  return routes;
}

实践建议

  1. 推荐使用自定义组件封装守卫逻辑
  2. 结合Context管理认证状态
  3. 注意v6中useNavigate的使用方式变更
  4. 避免在路由配置中直接使用component属性
推广
广告位招租

讨论

0/2000
Arthur481
Arthur481 · 2026-01-08T10:24:58
v6路由守卫核心是组件化思维,别再用v5的render模式了,直接用ProtectedRoute包装子组件更清晰
Violet192
Violet192 · 2026-01-08T10:24:58
自定义ProtectedRoute组件确实好用,但记得在authContext里做好isAuthenticated的状态管理
ShortFace
ShortFace · 2026-01-08T10:24:58
useRoutes虽然灵活,但对复杂嵌套路由来说,还是组件封装方式更易维护
紫色风铃姬
紫色风铃姬 · 2026-01-08T10:24:58
v6的Navigate替换Redirect是关键变化,别忘了replace属性的使用场景
MeanFiona
MeanFiona · 2026-01-08T10:24:58
实际项目中建议统一使用ProtectedRoute组件,避免路由配置过于分散难以维护
Ian553
Ian553 · 2026-01-08T10:24:58
路由守卫逻辑建议抽离到独立hook里,比如useAuthRedirect,提高复用性
StaleFish
StaleFish · 2026-01-08T10:24:58
v6不再支持Route的component属性,这确实是个breaking change,升级前要全量检查
HardWill
HardWill · 2026-01-08T10:24:58
推荐结合Context和useEffect做权限控制,避免每次渲染都重新判断认证状态