当前位置:首页 > React

react实现路由守卫

2026-01-27 08:11:07React

React 路由守卫实现方法

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

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

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

react实现路由守卫

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

自定义路由组件

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

react实现路由守卫

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

角色权限控制

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

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版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 在项目根目录的 package.json 文件中查看 dependencies 或 devDependencies 下的 react 和…

vue实现路由跳转

vue实现路由跳转

Vue 路由跳转的实现方式 在 Vue 中,路由跳转可以通过 vue-router 实现,以下是几种常见的方法: 声明式导航(模板中使用 <router-link>) 通过 <r…

vue实现动态路由按钮

vue实现动态路由按钮

Vue 实现动态路由按钮的方法 动态路由按钮的实现通常涉及权限控制,根据用户角色或权限动态显示或隐藏路由按钮。以下是几种常见方法: 基于路由元信息(meta)和v-if控制 在路由配置中添加权限标识…

vue路由实现内部切换

vue路由实现内部切换

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

react native如何启动

react native如何启动

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

react如何查

react如何查

React 查询方法 React 提供了多种查询 DOM 元素的方式,以下是几种常见的方法: 使用 ref 通过 useRef 钩子可以获取 DOM 节点的引用,适用于直接操作 DOM 的场景。…