当前位置:首页 > React

react如何拦截是否登录

2026-03-11 07:42:47React

拦截登录状态的常见方法

在React中拦截登录状态通常通过路由守卫、全局状态管理或高阶组件实现。以下是几种典型方案:

路由守卫(React Router v6)

使用Navigate组件和useNavigate钩子实现路由拦截:

import { Navigate, useNavigate } from 'react-router-dom';

const PrivateRoute = ({ children }) => {
  const isAuthenticated = localStorage.getItem('token');
  return isAuthenticated ? children : <Navigate to="/login" />;
};

// 使用示例
<Route path="/dashboard" element={<PrivateRoute><Dashboard /></PrivateRoute>} />

高阶组件(HOC)方案

创建高阶组件包裹需要保护的组件:

react如何拦截是否登录

function withAuth(Component) {
  return function AuthenticatedComponent(props) {
    const isLoggedIn = /* 登录状态判断逻辑 */;
    return isLoggedIn 
      ? <Component {...props} />
      : <Redirect to="/login" />;
  };
}

// 使用示例
const ProtectedPage = withAuth(Dashboard);

全局状态管理(Redux/Context)

结合Redux实现全局状态监听:

import { useSelector } from 'react-redux';

function AuthWrapper({ children }) {
  const { isAuthenticated } = useSelector(state => state.auth);
  return isAuthenticated ? children : null;
}

// 在Redux中配置登录状态变更监听
store.subscribe(() => {
  const state = store.getState();
  if (!state.auth.isAuthenticated) {
    // 跳转登录页
  }
});

拦截HTTP请求

使用axios拦截器处理未认证请求:

react如何拦截是否登录

axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 401) {
      window.location.href = '/login';
    }
    return Promise.reject(error);
  }
);

自定义Hook方案

创建useAuth钩子统一管理认证逻辑:

function useAuth() {
  const [isAuth, setIsAuth] = useState(false);

  useEffect(() => {
    const token = localStorage.getItem('token');
    setIsAuth(!!token);
  }, []);

  return { isAuth };
}

// 使用示例
function ProtectedComponent() {
  const { isAuth } = useAuth();
  return isAuth ? <MainContent /> : <LoginPage />;
}

服务端渲染(SSR)场景

在getServerSideProps中验证:

export async function getServerSideProps(context) {
  const { req } = context;
  if (!req.cookies.token) {
    return {
      redirect: {
        destination: '/login',
        permanent: false,
      },
    };
  }
  return { props: {} };
}

每种方案适用于不同场景,路由守卫适合SPA应用,高阶组件适合组件级控制,全局状态管理适合复杂应用,HTTP拦截适合API请求统一处理。实际开发中常组合使用多种方式。

标签: react
分享给朋友:

相关文章

react如何记忆

react如何记忆

React 记忆技术 在 React 中,记忆(Memoization)是一种优化技术,用于避免不必要的重新渲染或计算。React 提供了多种内置方法和第三方库来实现记忆功能。 useMemo Ho…

如何生成react代码

如何生成react代码

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

react如何销毁

react如何销毁

React 组件销毁的机制 在 React 中,组件的销毁通常由 React 的生命周期管理。当组件从 DOM 中移除时,React 会自动触发销毁相关的生命周期方法。以下是关键点: 组件的销毁通常…

react如何收录

react如何收录

React 收录方法 React 的收录主要涉及搜索引擎优化(SEO)和预渲染技术。由于 React 是单页应用(SPA),默认情况下内容由 JavaScript 动态生成,可能导致搜索引擎爬虫难以收…

react 如何运行

react 如何运行

运行 React 项目的步骤 安装 Node.js 确保系统已安装 Node.js(建议版本 16+),可通过官网下载并安装。安装后验证版本: node -v npm -v 创建 React 项目…

react如何迭代

react如何迭代

在 React 中迭代数组或对象 React 提供了多种方式来处理数组或对象的迭代,以下是常见的方法: 使用 map 方法迭代数组 map 是 JavaScript 数组的内置方法,常用于在 Rea…