当前位置:首页 > React

react如何拦截路由

2026-01-23 22:47:01React

拦截路由的实现方法

在React中拦截路由通常用于权限控制、数据预加载或页面跳转前的确认操作。以下是几种常见的实现方式:

使用React Router的导航守卫

React Router v6提供了useNavigateuseBeforeUnload等钩子来实现路由拦截:

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

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

  const isAuthenticated = checkAuth(); // 自定义认证检查

  if (!isAuthenticated) {
    navigate('/login', { state: { from: location } });
    return null;
  }

  return children;
}

自定义路由组件包装器

创建高阶组件包裹需要保护的路由:

function AuthWrapper({ children }) {
  const [allowed, setAllowed] = useState(false);

  useEffect(() => {
    async function checkPermission() {
      const hasAccess = await verifyPermissions();
      setAllowed(hasAccess);
    }
    checkPermission();
  }, []);

  return allowed ? children : <div>Loading or Access Denied</div>;
}

使用路由配置拦截

在路由配置中直接加入拦截逻辑:

const router = createBrowserRouter([
  {
    path: '/dashboard',
    element: <AuthCheck><Dashboard /></AuthCheck>,
    loader: async () => {
      const data = await fetchData();
      if (!data) throw new Response('', { status: 401 });
      return data;
    }
  }
]);

页面跳转前确认

实现离开页面前的确认对话框:

import { unstable_useBlocker as useBlocker } from 'react-router-dom';

function ConfirmNavigation() {
  const blocker = useBlocker(
    ({ currentLocation, nextLocation }) => 
      currentLocation.pathname !== nextLocation.pathname
  );

  useEffect(() => {
    if (blocker.state === 'blocked') {
      const confirm = window.confirm('Are you sure you want to leave?');
      if (confirm) blocker.proceed();
      else blocker.reset();
    }
  }, [blocker]);
}

路由加载拦截

利用React Router的loader函数在路由加载前拦截:

react如何拦截路由

export async function loader({ params }) {
  const resource = await getResource(params.id);
  if (!resource) {
    throw new Response('Not Found', { status: 404 });
  }
  return resource;
}

每种方法适用于不同场景,需要根据具体需求选择实现方式。权限验证通常使用高阶组件或路由包装器,数据预加载适合用loader拦截,关键操作确认适合使用导航守卫。

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

相关文章

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修改…

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实 D…

react如何动画

react如何动画

React 动画实现方法 React 中实现动画可以通过多种方式,包括原生 CSS、第三方库或 React 内置的动画解决方案。以下是几种常见方法: 使用 CSS 动画和过渡 通过 CSS 的 tr…

react如何拓展

react如何拓展

React 拓展方法 使用高阶组件(HOC) 高阶组件是一种复用组件逻辑的方式,通过接收一个组件并返回一个新组件实现功能拓展。例如,为组件添加日志功能: function withLogging…

react如何刷新

react如何刷新

刷新React组件的方法 使用状态更新触发重新渲染 通过更新组件的状态可以触发重新渲染。React会在状态变化时自动重新渲染组件。 const [count, setCount] = useStat…

react如何注销

react如何注销

React 组件的注销方法 在 React 中,组件的注销通常指的是在组件卸载时执行清理操作,例如取消订阅、清除定时器或释放资源。以下是几种常见的方法: 使用 useEffect 钩子的清理函数…