当前位置:首页 > 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
分享给朋友:

相关文章

vue 路由 实现

vue 路由 实现

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

react如何部署

react如何部署

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

如何创建react

如何创建react

创建React项目的步骤 使用Create React App工具快速搭建React项目。确保已安装Node.js(版本需≥14.0.0)和npm(版本需≥5.6)。 打开终端或命令行工具,运行以下…

react如何开发

react如何开发

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

react如何重置

react如何重置

重置 React 应用的状态 使用 useState 钩子重新初始化状态变量是最直接的方法。将状态变量重置为初始值或空值即可完成重置。 const [count, setCount] = useSt…

react如何循环

react如何循环

循环渲染列表 在React中循环渲染列表通常使用map方法,这是最常用的方式。通过map可以将数组中的每个元素转换为React元素并渲染到页面上。 const items = ['Apple', '…