当前位置:首页 > 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="/" />;
}

路由守卫模式

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

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

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

  return verified ? children : <LoadingScreen />;
}

注意事项

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

react如何实现路由拦截

分享给朋友:

相关文章

vue如何实现计算

vue如何实现计算

Vue 实现计算的方法 Vue 提供了多种方式来实现计算逻辑,包括计算属性、方法、侦听器等。以下是几种常见的实现方式: 计算属性(Computed Properties) 计算属性是基于它们的响应…

vue如何实现目录组件

vue如何实现目录组件

实现目录组件的基本思路 在Vue中实现目录组件通常需要结合页面内容的结构化数据(如标题层级),通过动态渲染生成可交互的目录。核心步骤包括提取标题、生成目录结构、实现滚动联动等。 提取标题信息 通过d…

vue如何实现两栏布局

vue如何实现两栏布局

使用Flexbox实现两栏布局 Flexbox是CSS3中强大的布局方式,可以轻松实现两栏布局。在Vue中可以直接在组件的style标签中使用。 <template> <di…

h5如何实现vr效果

h5如何实现vr效果

使用WebXR API实现VR效果 WebXR是浏览器中实现VR/AR的核心API,支持设备姿态追踪、渲染交互等功能。需在支持WebXR的设备(如Oculus、HTC Vive)或浏览器模拟环境中运行…

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTM…

vue如何实现重新实现主题

vue如何实现重新实现主题

Vue 主题切换的实现方法 使用 CSS 变量动态切换主题 定义主题相关的 CSS 变量,通过修改这些变量实现主题切换。在根元素(如 :root)中定义默认主题的变量,在特定类名下定义其他主题的变量。…