当前位置:首页 > React

react router实现路由拦截

2026-01-27 19:17:22React

路由拦截的实现方式

在React Router中实现路由拦截通常涉及以下方法,核心思路是通过高阶组件或自定义路由组件对导航行为进行控制。

使用高阶组件封装路由

通过高阶组件包裹目标路由,在渲染前进行权限或条件校验:

const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => (
  <Route
    {...rest}
    render={(props) =>
      isAuthenticated ? (
        <Component {...props} />
      ) : (
        <Redirect to="/login" />
      )
    }
  />
);

// 使用示例
<PrivateRoute 
  path="/dashboard" 
  component={Dashboard} 
  isAuthenticated={userLoggedIn}
/>

自定义路由组件

创建继承自Route的自定义组件,重写渲染逻辑:

react router实现路由拦截

class AuthRoute extends Route {
  render() {
    const { fallbackPath, authCheck, ...props } = this.props;
    return authCheck() 
      ? super.render() 
      : <Redirect to={fallbackPath} />;
  }
}

// 使用示例
<AuthRoute 
  path="/admin" 
  component={AdminPanel}
  authCheck={() => checkAdminRole()}
  fallbackPath="/no-access"
/>

路由守卫模式

在全局路由配置中使用onEnter钩子(v5及之前版本):

<Route 
  path="/profile"
  component={Profile}
  onEnter={(nextState, replace) => {
    if (!hasToken()) replace('/auth');
  }}
/>

使用useNavigate拦截

React Router v6+推荐方案,通过自定义导航钩子:

react router实现路由拦截

const useAuthRedirect = () => {
  const navigate = useNavigate();
  const location = useLocation();

  useEffect(() => {
    const publicPaths = ['/login', '/register'];
    if (!publicPaths.includes(location.pathname) && !isAuth()) {
      navigate('/login', { state: { from: location } });
    }
  }, [location]);
};

// 在根组件调用
function App() {
  useAuthRedirect();
  return <Routes>...</Routes>;
}

动态路由加载拦截

结合React.lazy实现异步路由拦截:

const LazyAdmin = React.lazy(() => {
  return verifyAdmin().then(
    () => import('./Admin'),
    () => ({ default: () => <Redirect to="/" /> })
  );
});

<Route path="/admin" element={
  <Suspense fallback={<Spinner />}>
    <LazyAdmin />
  </Suspense>
} />

路由配置集中管理

通过声明式配置实现集中式路由守卫:

const routeConfig = [
  {
    path: '/',
    element: <Home />,
    guards: [checkGuest],
  },
  {
    path: '/settings',
    element: <Settings />,
    guards: [checkAuth, checkSubscription],
    redirect: '/upgrade',
  }
];

const GuardedRoutes = () => {
  return (
    <Routes>
      {routeConfig.map((route) => (
        <Route 
          key={route.path}
          path={route.path}
          element={<RouteGuard {...route} />}
        />
      ))}
    </Routes>
  );
};

每种方案适用于不同场景,v6+推荐使用组合式导航钩子方案,v4/v5可采用高阶组件模式。实际选择应考虑项目架构版本和技术栈的统一性。

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

相关文章

vue路由实现内部切换

vue路由实现内部切换

Vue路由实现内部切换的方法 Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。以下是几种常见的路由切换方式: 使用<router-link>组件 &l…

如何提高react

如何提高react

优化性能 使用React.memo对组件进行记忆化处理,避免不必要的重新渲染。对于类组件,可以使用PureComponent来达到类似效果。 利用useMemo缓存计算结果,避免重复计算。对于函数或…

react项目如何

react项目如何

创建React项目 使用create-react-app工具快速初始化项目。确保已安装Node.js(建议版本≥12.0.0),运行以下命令生成新项目: npx create-react-app m…

react如何debugger

react如何debugger

调试 React 应用的方法 使用浏览器开发者工具进行调试 React 开发者工具(React DevTools)是调试 React 应用的必备工具。安装 Chrome 或 Firefox 扩展后,可…

react如何引入

react如何引入

引入React的方法 React可以通过多种方式引入项目,具体取决于项目需求和开发环境。以下是常见的几种方法: 通过CDN引入 在HTML文件中直接通过CDN链接引入React和ReactDOM:…

vscode如何配置react

vscode如何配置react

配置 VSCode 进行 React 开发 安装必要插件 ES7+ React/Redux/React-Native snippets:提供 React 代码片段快速生成功能。 Prettier -…