You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Router v6是否有类似Vue Router beforeEach的路由守卫方法?

在React Router v6中实现类似Vue Router beforeEach的导航守卫功能

React Router v6没有和Vue Router beforeEach完全一一对应的API,但可以通过几种实用方式实现类似的全局/路由级导航拦截逻辑,以下是具体方案:

一、全局前置导航拦截(对应全局beforeEach)

如果需要监听所有路由跳转并做全局校验,可以结合useLocation、useNavigate和useEffect实现,同时用ref保存上一次路由来模拟Vue的from参数:

import { useLocation, useNavigate, useEffect } from 'react-router-dom';
import React from 'react';

function AppLayout() {
  const location = useLocation();
  const navigate = useNavigate();
  const previousLocation = React.useRef(location);

  useEffect(() => {
    // to: 即将进入的目标路由,from: 上一次的路由
    const to = location;
    const from = previousLocation.current;

    // 示例:未登录时拦截后台路由
    if (to.pathname.startsWith('/admin') && !localStorage.getItem('token')) {
      // 类似Vue的next('/login'),replace避免回退到拦截前的路由
      navigate('/login', { replace: true });
      return;
    }

    // 允许导航,更新上一次路由记录
    previousLocation.current = location;
  }, [location, navigate]);

  return <Outlet />;
}

注:这种方式是导航启动后触发,但通过navigate的replace选项可以覆盖当前导航,达到拦截效果。

二、路由级守卫(局部拦截)

如果只需要保护特定路由,推荐封装一个守卫组件,包裹需要校验的路由元素:

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

function AuthGuard() {
  const isLoggedIn = () => localStorage.getItem('token') !== null;

  // 未登录则重定向到登录页,已登录则渲染子路由
  if (!isLoggedIn()) {
    return <Navigate to="/login" replace />;
  }
  return <Outlet />;
}

// 路由配置中使用
const router = createBrowserRouter([
  {
    path: '/admin',
    element: <AuthGuard />,
    children: [
      { path: '', element: <AdminDashboard /> },
      { path: 'settings', element: <AdminSettings /> },
    ],
  },
  { path: '/login', element: <LoginPage /> },
]);

三、用Loader函数做路由前置校验

React Router v6的loader函数会在路由渲染之前执行,适合做路由级的前置校验,不会出现页面闪烁:

import { createBrowserRouter, redirect } from 'react-router-dom';

const router = createBrowserRouter([
  {
    path: '/admin',
    element: <AdminDashboard />,
    loader: () => {
      // 校验登录状态,未登录直接抛出重定向
      if (!localStorage.getItem('token')) {
        return redirect('/login');
      }
      // 可以同时预加载页面需要的数据
      return fetchAdminData();
    },
  },
]);

根据你的需求选择对应方案:全局拦截用useEffect+useLocation,局部路由保护用守卫组件,路由级前置校验用loader函数。

内容的提问来源于stack exchange,提问作者JCraine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 09:35:17