当前位置:首页 > React

react如何拦截路由

2026-01-23 22:47:01React

拦截路由的实现方法

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

使用React Router的导航守卫

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

react如何拦截路由

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

使用路由配置拦截

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

react如何拦截路由

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函数在路由加载前拦截:

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 项目依赖 打开项目根目录下的 package.json 文件,删除所有包含 react、react-dom 或其他 React 相关库的依赖项。保存文件后运行以下命令: npm u…

vue路由实现内部切换

vue路由实现内部切换

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

vue 路由 实现

vue 路由 实现

Vue 路由实现方法 Vue 路由通常通过 Vue Router 实现,它是 Vue.js 官方的路由管理器,用于构建单页应用(SPA)。以下是具体实现步骤: 安装 Vue Router 通过 n…

react native 如何

react native 如何

React Native 开发基础 React Native 是一个用于构建跨平台移动应用的框架,允许开发者使用 JavaScript 和 React 编写代码,同时生成原生 iOS 和 Androi…

如何react页面

如何react页面

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

react性能如何

react性能如何

React 性能特点 React 通过虚拟 DOM(Virtual DOM)和高效的 diff 算法优化性能。虚拟 DOM 减少了直接操作真实 DOM 的开销,仅在必要时更新变化的部分。React 的…