v6版本路由守卫配置

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

React Router v6 路由守卫配置踩坑记录

最近在将项目从 React Router v5 升级到 v6 时,路由守卫的配置让我头疼不已。v6 版本对路由组件的渲染方式做了重大调整,导致原有的守卫逻辑完全失效。

核心问题

v6 中取消了 Route 组件的 component 属性,改为使用 element 属性来传递组件。这使得原本在 v5 中通过 rendercomponent 实现的守卫逻辑无法直接迁移。

解决方案一:自定义 Hook 方式

const useAuth = () => {
  const [isAuthenticated, setIsAuthenticated] = useState(false);
  
  useEffect(() => {
    // 检查用户认证状态
    const checkAuth = async () => {
      const token = localStorage.getItem('token');
      if (token) {
        setIsAuthenticated(true);
      }
    };
    checkAuth();
  }, []);
  
  return isAuthenticated;
};

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

解决方案二:路由配置中直接使用

const App = () => {
  return (
    <Routes>
      <Route path="/login" element={<Login />} />
      <Route 
        path="/dashboard" 
        element={
          <ProtectedRoute>
            <Dashboard />
          </ProtectedRoute>
        }
      />
    </Routes>
  );
};

坑点总结

  1. v6 中 Navigate 组件替代了 v5 的 Redirect
  2. 不再支持在 Route 上直接配置守卫函数
  3. 需要将守卫逻辑封装为独立组件或 Hook

升级过程中遇到的最大挑战就是如何优雅地处理认证守卫,最终通过自定义 Hook + 条件渲染的方式解决了这个问题。

推广
广告位招租

讨论

0/2000
GoodBird
GoodBird · 2026-01-08T10:24:58
v6的element属性确实让守卫逻辑更难写,但用自定义Hook封装auth状态是标准做法,记得把token校验抽成独立模块复用。
深海探险家
深海探险家 · 2026-01-08T10:24:58
ProtectedRoute组件写法没问题,但别忘了在auth hook里加loading状态,否则页面会闪一下白屏。
CoolWizard
CoolWizard · 2026-01-08T10:24:58
直接在路由配置里套ProtectedRoute虽然可行,但不利于组件层级清晰,建议统一用Route的element属性配合自定义Hook处理。
梦幻舞者
梦幻舞者 · 2026-01-08T10:24:58
Navigate替代Redirect这点很关键,别忘了它支持replace和state属性,能控制跳转行为细节。
Ursula959
Ursula959 · 2026-01-08T10:24:58
v6的守卫逻辑本质是组件化渲染,所以不要想着在Route上搞个guard函数,得老老实实用高阶组件或Hook封装