当前位置:首页 > React

react如何实现路由拦截

2026-01-24 20:05:45React

路由拦截的实现方式

在React中实现路由拦截通常涉及在路由跳转前进行权限或条件检查,可以通过React Router提供的API或自定义逻辑完成。

使用Navigate组件重定向

通过useNavigate钩子和条件判断实现拦截,未满足条件时重定向到指定页面:

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

function PrivateRoute({ children }) {
  const isAuthenticated = checkAuth(); // 自定义权限验证逻辑
  return isAuthenticated ? children : <Navigate to="/login" replace />;
}

通过useEffect监听路由变化

在组件内监听路由变化并执行拦截逻辑:

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

function AuthChecker() {
  const navigate = useNavigate();
  const location = useLocation();

  useEffect(() => {
    if (!isAllowedRoute(location.pathname)) {
      navigate('/forbidden', { replace: true });
    }
  }, [location]);
}

自定义高阶组件(HOC)

创建高阶组件包裹需要保护的路由组件:

function withAuth(Component) {
  return function WrappedComponent(props) {
    const isAuth = checkAuth();
    if (!isAuth) {
      return <Navigate to="/login" replace />;
    }
    return <Component {...props} />;
  };
}

// 使用方式
const ProtectedDashboard = withAuth(Dashboard);

路由配置中定义拦截器

在路由配置层进行全局拦截(React Router v6示例):

const router = createBrowserRouter([
  {
    path: '/',
    element: <Root />,
    children: [
      {
        path: 'profile',
        element: <AuthWrapper><Profile /></AuthWrapper>
      }
    ]
  }
]);

function AuthWrapper({ children }) {
  return localStorage.getItem('token') ? children : <Navigate to="/" />;
}

路由守卫模式

仿照传统路由守卫的实现方式:

react如何实现路由拦截

function RouterGuard({ children }) {
  const [verified, setVerified] = useState(false);

  useEffect(() => {
    async function verify() {
      const isValid = await validateToken();
      setVerified(isValid);
    }
    verify();
  }, []);

  return verified ? children : <LoadingScreen />;
}

注意事项

  • 同步验证适合快速判断(如本地存储检查),异步验证需处理加载状态
  • 使用replace参数避免路由历史记录污染
  • 敏感路由建议服务端二次校验
  • 动态路由参数需在拦截逻辑中特殊处理

分享给朋友:

相关文章

vue 路由实现

vue 路由实现

Vue 路由实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue 路由的基本步骤: 安装 Vue Router 使用 npm 或 ya…

vue如何实现拖动

vue如何实现拖动

Vue 实现拖动的常用方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现拖动功能。 <template>…

vue路由实现思路

vue路由实现思路

Vue 路由实现思路 Vue 路由的核心是通过 Vue Router 库实现单页应用(SPA)的页面切换,避免整页刷新。以下是关键实现思路: 安装与引入 Vue Router 通过 npm 或 ya…

java如何实现跨平台

java如何实现跨平台

Java实现跨平台的原理 Java通过“一次编写,到处运行”的设计理念实现跨平台能力。其核心机制包括: Java虚拟机(JVM) Java源代码编译为字节码(.class文件),由JVM解释执行。不…

h5如何实现蜡烛点亮

h5如何实现蜡烛点亮

实现蜡烛点亮的H5方法 在H5中实现蜡烛点亮效果,可以通过CSS动画、Canvas绘图或结合JavaScript交互来实现。以下是几种常见的方法: 使用CSS动画和JavaScript 通过…

react如何获取路由

react如何获取路由

获取当前路由路径 在React中获取当前路由路径可以通过react-router-dom提供的useLocation钩子。useLocation返回一个包含当前路由信息的对象,其中pathname属性…