当前位置:首页 > React

react实现路由守卫

2026-01-27 08:11:07React

React 路由守卫实现方法

在 React 中实现路由守卫(Route Guard)可以通过多种方式完成,以下是常见的几种方法:

使用高阶组件(HOC)包装路由

创建高阶组件来检查用户权限或登录状态,再决定是否渲染目标组件:

const withAuth = (Component) => {
  return (props) => {
    const isAuthenticated = checkAuth(); // 自定义认证逻辑
    return isAuthenticated ? (
      <Component {...props} />
    ) : (
      <Navigate to="/login" replace />
    );
  };
};

// 使用方式
<Route path="/protected" element={withAuth(ProtectedComponent)} />

利用 React Router v6 的 element 属性

在路由配置中直接进行守卫逻辑判断:

<Route
  path="/dashboard"
  element={
    <RequireAuth>
      <Dashboard />
    </RequireAuth>
  }
/>

// RequireAuth 组件实现
function RequireAuth({ children }) {
  const auth = useAuth();
  if (!auth.user) {
    return <Navigate to="/login" />;
  }
  return children;
}

自定义路由组件

创建自定义路由组件封装守卫逻辑:

const PrivateRoute = ({ component: Component, ...rest }) => {
  const { isAuthenticated } = useAuth();
  return (
    <Route
      {...rest}
      render={(props) =>
        isAuthenticated ? (
          <Component {...props} />
        ) : (
          <Redirect to={{ pathname: "/login" }} />
        )
      }
    />
  );
};

// 使用方式
<PrivateRoute path="/admin" component={AdminPanel} />

使用路由拦截器

在全局路由变化时进行拦截:

function App() {
  const location = useLocation();
  const navigate = useNavigate();

  useEffect(() => {
    if (!isAuthPage(location.pathname) && !isAuthenticated()) {
      navigate('/login', { state: { from: location } });
    }
  }, [location]);

  return <Routes>...</Routes>;
}

角色权限控制

对于需要基于角色的权限控制:

react实现路由守卫

const RoleRoute = ({ roles, children }) => {
  const userRole = getUserRole(); // 获取用户角色
  return roles.includes(userRole) ? children : <Navigate to="/unauthorized" />;
};

// 使用方式
<Route
  path="/admin"
  element={
    <RoleRoute roles={['admin']}>
      <AdminPage />
    </RoleRoute>
  }
/>

注意事项

  • 守卫逻辑应该与路由配置解耦,便于维护
  • 考虑添加加载状态处理异步验证
  • 登录后重定向到原始请求页面
  • 对于嵌套路由,守卫逻辑需要应用到每个需要保护的层级

以上方法可以根据具体项目需求组合使用,React Router v6 推荐使用 element 属性配合自定义组件的方式实现路由守卫。

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

相关文章

如何评价react native

如何评价react native

React Native 的优势 跨平台开发效率高 React Native 允许开发者使用 JavaScript 和 React 编写代码,同时生成 iOS 和 Android 应用,大幅减少开发成…

react 如何调试

react 如何调试

调试 React 应用的方法 使用 React Developer Tools 安装 Chrome 或 Firefox 的 React Developer Tools 扩展,可以检查组件树、状态和 p…

react 如何精通

react 如何精通

掌握核心概念 深入理解React的基础概念,包括组件(函数组件与类组件)、状态(useState)、生命周期(useEffect)、Props传递、虚拟DOM与Diff算法。通过官方文档或《React…

react 如何修改state

react 如何修改state

修改 state 的基础方法 在 React 中,state 的修改必须通过 setState 方法(类组件)或 state 更新函数(函数组件)。直接修改 state 会导致组件不会重新渲染,且可能…

react如何获取路由

react如何获取路由

获取当前路由路径 在React中获取当前路由路径可以通过react-router-dom提供的useLocation钩子。useLocation返回一个包含当前路由信息的对象,其中pathname属性…

react如何编码参数

react如何编码参数

编码参数的方法 在React中,编码参数通常涉及URL查询参数或路由参数的编码和解码。以下是几种常见场景的处理方法: URL查询参数编码 使用encodeURIComponent对参数进行编码,避免…