当前位置:首页 > React

react实现路由拦截

2026-01-27 07:42:14React

路由拦截的实现方法

在React中实现路由拦截通常通过高阶组件或自定义钩子完成,以下是几种常见方法:

使用React Router的<Navigate>组件

利用React Router v6的<Navigate>组件进行重定向,结合条件判断实现拦截逻辑:

react实现路由拦截

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

const PrivateRoute = ({ children }) => {
  const isAuthenticated = checkAuth(); // 自定义认证逻辑
  const location = useLocation();

  if (!isAuthenticated) {
    return <Navigate to="/login" state={{ from: location }} replace />;
  }

  return children;
};

// 使用方式
<Route path="/dashboard" element={
  <PrivateRoute>
    <Dashboard />
  </PrivateRoute>
} />

自定义路由守卫组件

创建路由守卫组件封装拦截逻辑,适用于需要统一处理权限的场景:

const RouteGuard = ({ component: Component, ...rest }) => {
  const hasPermission = checkPermissions(rest.path);

  return hasPermission ? (
    <Component {...rest} />
  ) : (
    <div>无权限访问</div>
  );
};

// 路由配置
<Routes>
  <Route path="/admin" element={<RouteGuard component={AdminPage} />} />
</Routes>

使用路由配置拦截

在路由配置阶段预处理拦截逻辑,适用于静态路由配置:

react实现路由拦截

const routes = [
  {
    path: '/profile',
    element: <Profile />,
    beforeEnter: () => {
      if (!isLoggedIn()) {
        return '/login';
      }
      return true;
    }
  }
];

const RouterWithInterceptor = () => {
  const element = useRoutes(routes.map(route => {
    if (route.beforeEnter) {
      const result = route.beforeEnter();
      if (result !== true) {
        return { ...route, element: <Navigate to={result} replace /> };
      }
    }
    return route;
  }));

  return element;
};

使用useEffect监听路由变化

在页面组件内通过useEffect监听路由变化实现拦截:

const ProtectedPage = () => {
  const navigate = useNavigate();

  useEffect(() => {
    const token = localStorage.getItem('token');
    if (!token) {
      navigate('/login', { replace: true });
    }
  }, [navigate]);

  return <div>受保护内容</div>;
};

权限验证高阶组件

创建高阶组件包装需要拦截的组件,实现复用:

const withAuth = (WrappedComponent) => {
  return (props) => {
    const [verified, setVerified] = useState(false);
    const navigate = useNavigate();

    useEffect(() => {
      const verify = async () => {
        const isValid = await verifyToken();
        if (!isValid) {
          navigate('/auth-error');
        }
        setVerified(true);
      };
      verify();
    }, [navigate]);

    return verified ? <WrappedComponent {...props} /> : <LoadingSpinner />;
  };
};

// 使用方式
const EnhancedComponent = withAuth(SensitiveComponent);

注意事项

  • 异步验证时需处理加载状态
  • 记住原始路由以便登录后跳转
  • 服务端渲染场景需考虑服务端验证
  • 路由拦截可能影响浏览器历史记录

以上方法可根据实际项目需求组合使用,React Router v6的拦截实现更倾向于组件化方式,相比v5有更明确的API设计。

标签: 路由react
分享给朋友:

相关文章

vue实现路由守卫

vue实现路由守卫

路由守卫的基本概念 路由守卫是 Vue Router 提供的一种机制,用于在路由跳转前后执行特定的逻辑。通过路由守卫,可以实现权限控制、页面访问限制、数据预加载等功能。 全局前置守卫 使用 rout…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在 s…

react如何卸载

react如何卸载

卸载 React 项目或依赖 如果需要完全卸载 React 项目或相关依赖,可以按照以下步骤操作: 删除项目文件夹 直接删除整个项目文件夹是最彻底的方式。确保已备份重要代码或配置文件。 卸载全局安…

理解如何react

理解如何react

理解React的核心概念 React是一个用于构建用户界面的JavaScript库,专注于通过组件化开发提高代码的可维护性和复用性。其核心思想包括虚拟DOM(Virtual DOM)和单向数据流,能够…

react如何同步

react如何同步

React 同步状态管理方法 在 React 中实现同步状态管理,可以通过以下多种方式实现: 使用 useState 和 useEffect 钩子 通过 useState 定义状态,使用 useEf…

react如何下载

react如何下载

安装 React 的步骤 通过 npm 或 yarn 安装 React,确保已安装 Node.js(版本建议 ≥ 14.0.0)。打开终端或命令行工具,运行以下命令: npx create-reac…