当前位置:首页 > 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)方案

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

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拦截器处理未认证请求:

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中验证:

react如何拦截是否登录

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 项目的关键方法 分析当前项目结构 通过评估现有组件、状态管理和依赖项,明确需要改进的部分。使用工具如 webpack-bundle-analyzer 识别性能瓶颈。 升级 Reac…

react如何调试

react如何调试

调试 React 应用的方法 使用 React Developer Tools React Developer Tools 是 Chrome 和 Firefox 的浏览器扩展,可以检查组件树、状态和…

react如何diff

react如何diff

React Diff 算法原理 React 的 Diff 算法是 Virtual DOM 的核心部分,用于高效更新真实 DOM。其核心思想是通过对比新旧 Virtual DOM 树的差异,最小化 DO…

react如何同步

react如何同步

React 同步状态管理方法 在 React 中实现同步状态管理,可以通过以下多种方式实现: 使用 useState 和 useEffect 钩子 通过 useState 定义状态,使用 useEf…

react如何循环

react如何循环

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

react如何扩展

react如何扩展

扩展 React 项目的常用方法 使用高阶组件(HOC) 高阶组件是一种复用组件逻辑的方式。通过包裹组件并注入额外属性或逻辑,可以实现功能扩展。例如,一个日志记录的高阶组件: function…