当前位置:首页 > 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函数在路由加载前拦截:

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 moment如何使用

react moment如何使用

安装 react-moment 通过 npm 或 yarn 安装 react-moment 包。确保项目中已安装 moment.js,因为 react-moment 依赖它。 npm instal…

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

react native如何启动

react native如何启动

如何启动 React Native 项目 安装 Node.js 和 npm 确保已安装 Node.js(建议版本 16 或更高)和 npm(Node.js 自带)。可通过以下命令检查版本: nod…

react如何取消渲染

react如何取消渲染

取消渲染的方法 在React中,取消渲染通常指的是在某些条件下阻止组件渲染或中断正在进行的渲染过程。以下是几种常见的方法: 条件渲染 通过条件判断决定是否渲染组件或部分内容。可以使用if语句或三元…

如何生成react代码

如何生成react代码

使用 Create React App 生成项目 安装 Node.js 后,通过命令行工具运行以下命令创建新项目: npx create-react-app my-app cd my-app np…

如何react页面

如何react页面

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