v6路由跳转控制

Ethan385 +0/-0 0 0 正常 2025-12-24T07:01:19 React-Router · 路由跳转

React Router v6路由跳转控制实践

在React Router v6中,路由跳转控制相比v5有了显著变化。本文将详细介绍如何在v6中实现灵活的路由跳转控制。

v6路由跳转方式

1. 使用useNavigate Hook

import { useNavigate } from 'react-router-dom';

function MyComponent() {
  const navigate = useNavigate();
  
  const handleNavigation = () => {
    // 跳转到指定路径
    navigate('/dashboard');
    
    // 带参数跳转
    navigate('/user/123', { state: { from: 'home' } });
    
    // 后退
    navigate(-1);
    
    // 前进
    navigate(1);
  };
}

2. 条件路由跳转控制

function ProtectedRoute() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  const navigate = useNavigate();
  
  useEffect(() => {
    // 检查登录状态
    if (!isLoggedIn) {
      navigate('/login', { replace: true });
    }
  }, [isLoggedIn]);
  
  return isLoggedIn ? <Dashboard /> : <Login />;
}

3. 路由守卫实现

function App() {
  const [user, setUser] = useState(null);
  
  // 全局路由守卫
  const routeComponents = [
    { path: '/login', component: Login },
    { path: '/dashboard', component: Dashboard, requiresAuth: true }
  ];
  
  return (
    <Routes>
      {routeComponents.map((route) => {
        if (route.requiresAuth && !user) {
          return <Route key={route.path} path={route.path} element={<Navigate to="/login" replace />} />;
        }
        return <Route key={route.path} path={route.path} element={<route.component />} />;
      })}
    </Routes>
  );
}

实际应用示例

在实际项目中,我们经常需要根据用户权限控制跳转。通过useNavigate配合状态管理,可以实现精准的路由控制。

复现步骤:

  1. 创建登录组件并实现登录逻辑
  2. 使用useNavigate进行跳转
  3. 在需要保护的路由上添加条件判断
  4. 测试不同场景下的跳转行为
推广
广告位招租

讨论

0/2000
David99
David99 · 2026-01-08T10:24:58
v6的useNavigate确实比v5的history API更直观,但要注意replace和push的区别,特别是登录跳转时用replace避免历史记录堆叠
Kyle630
Kyle630 · 2026-01-08T10:24:58
条件跳转控制最好放在useEffect里,我之前直接在组件渲染时判断导致无限重定向,坑了好久
SweetLuna
SweetLuna · 2026-01-08T10:24:58
路由守卫建议封装成自定义Hook,比如useAuthGuard,这样复用性更高,代码也更清晰
GladAlice
GladAlice · 2026-01-08T10:24:58
参数传递用state确实方便,但要注意服务端渲染时的兼容性问题,生产环境要测试一下
SpicyTiger
SpicyTiger · 2026-01-08T10:24:58
后退导航navigate(-1)在某些复杂路由场景下可能失效,建议配合useLocation做更精确的控制
Quincy413
Quincy413 · 2026-01-08T10:24:58
实际项目中我习惯把所有路由跳转都统一到一个路由管理模块,这样便于维护和调试