当前位置:首页 > React

react实现路由拦截

2026-01-27 07:42:14React

路由拦截的实现方法

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

使用React Router的<Navigate>组件

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

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>

使用路由配置拦截

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

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>;
};

权限验证高阶组件

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

react实现路由拦截

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.js) 户籍系统通常需要管理居民信息、户籍变动、统计查询等功能模块。以下基于Vue Router的实现方案: 路由模块设计 在src/router/index.js中定义核…

vue路由实现思路

vue路由实现思路

Vue 路由实现思路 Vue 路由的核心是通过 Vue Router 库实现的单页面应用(SPA)路由管理。以下是关键实现思路和步骤: 安装 Vue Router 通过 npm 或 yarn 安装…

vue实现动态路由按钮

vue实现动态路由按钮

Vue 实现动态路由按钮的方法 动态路由按钮的实现通常涉及权限控制,根据用户角色或权限动态显示或隐藏路由按钮。以下是几种常见方法: 基于路由元信息(meta)和v-if控制 在路由配置中添加权限标识…

react如何取消渲染

react如何取消渲染

取消渲染的方法 在React中,取消渲染通常指的是在某些条件下阻止组件渲染或中断正在进行的渲染过程。以下是几种常见的方法: 条件渲染 通过条件判断决定是否渲染组件或部分内容。可以使用if语句或三元运…

react如何部署

react如何部署

部署 React 应用的常见方法 使用静态服务器部署 React 应用在构建后会生成静态文件,可以直接通过静态服务器部署。常用的静态服务器包括 Nginx、Apache 等。 运行构建命令生成静态文…

react如何encode

react如何encode

React 中编码的实现方式 在 React 中,编码通常涉及对 URL、HTML 实体或特殊字符的处理。以下是几种常见的编码方法: 使用 encodeURIComponent 进行 URL 编码…