当前位置:首页 > React

react实现beforeEach

2026-01-26 14:17:11React

React 实现类似路由守卫的 beforeEach 功能

在 React 中实现类似 Vue 路由守卫的 beforeEach 功能,可以通过 React Router 提供的导航守卫机制结合自定义逻辑完成。

使用 React Router v6 的导航守卫

React Router v6 提供了 useNavigateuseLocation 钩子,结合 useEffect 可以实现路由跳转前的拦截逻辑。

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

function RouterGuard({ children }) {
  const navigate = useNavigate();
  const location = useLocation();

  useEffect(() => {
    // 在这里添加路由跳转前的逻辑
    const isAuthenticated = checkAuth(); // 自定义认证检查
    if (!isAuthenticated && location.pathname !== '/login') {
      navigate('/login', { replace: true });
    }
  }, [location, navigate]);

  return children;
}

自定义高阶组件封装

可以创建一个高阶组件来封装路由守卫逻辑,使代码更易于复用。

function withRouterGuard(WrappedComponent, guardFn) {
  return function(props) {
    const navigate = useNavigate();
    const location = useLocation();

    useEffect(() => {
      guardFn({ navigate, location });
    }, [location, navigate]);

    return <WrappedComponent {...props} />;
  };
}

在路由配置中应用守卫

可以在路由配置中为需要保护的路由添加守卫组件。

const routes = [
  {
    path: '/',
    element: (
      <RouterGuard>
        <HomePage />
      </RouterGuard>
    ),
  },
  {
    path: '/dashboard',
    element: (
      <RouterGuard>
        <Dashboard />
      </RouterGuard>
    ),
  },
];

实现完整的认证流程示例

function App() {
  return (
    <Routes>
      <Route path="/login" element={<Login />} />
      <Route
        path="/protected"
        element={
          <RequireAuth>
            <ProtectedPage />
          </RequireAuth>
        }
      />
    </Routes>
  );
}

function RequireAuth({ children }) {
  const auth = useAuth();
  const location = useLocation();

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

  return children;
}

处理异步验证逻辑

对于需要异步验证的场景,可以使用 Promise 或 async/await。

react实现beforeEach

useEffect(() => {
  const checkAccess = async () => {
    const hasAccess = await verifyUserAccess();
    if (!hasAccess) {
      navigate('/no-access');
    }
  };
  checkAccess();
}, [location, navigate]);

这些方法提供了在 React 中实现路由跳转前逻辑的各种方式,可以根据具体需求选择最适合的实现方案。

标签: reactbeforeEach
分享给朋友:

相关文章

react 如何继承

react 如何继承

在React中,组件继承并非推荐的设计模式(官方更推崇组合优于继承),但技术上仍可通过以下方式实现类似效果: 使用ES6类继承 通过extends关键字继承父组件类,子组件可访问父组件的生命周期方法…

如何评价react native

如何评价react native

React Native 的优势 跨平台开发效率高:基于 JavaScript 和 React 语法,可同时开发 iOS 和 Android 应用,减少重复代码量。性能接近原生:通过原生组件渲染,性能…

react 如何运行

react 如何运行

运行 React 项目的步骤 安装 Node.js 确保系统已安装 Node.js(建议版本 16+),可通过官网下载并安装。安装后验证版本: node -v npm -v 创建 React 项目…

react如何开发

react如何开发

React 开发基础步骤 安装 Node.js 和 npm/yarn 确保系统已安装 Node.js(包含 npm)或 Yarn。React 项目依赖这些工具管理包和运行脚本。官方推荐使用 Node.…

react 如何跳转

react 如何跳转

使用 React Router 进行页面跳转 React 应用中通常使用 react-router-dom 库实现页面跳转。以下是几种常见的跳转方式: 安装依赖 npm install react…

react如何发布

react如何发布

发布React应用的步骤 构建生产版本 使用以下命令生成优化后的生产版本代码,代码会被压缩并移除开发环境中的调试工具: npm run build 构建完成后会生成build文件夹,包含所有静态资源…