当前位置:首页 > React

react如何封装请求

2026-02-12 07:30:30React

封装请求的常见方法

在React中封装HTTP请求通常涉及创建可复用的函数或钩子,以减少重复代码并统一处理错误、loading状态等。以下是几种典型实现方式:

使用axios实例封装

创建基础的axios实例,配置拦截器和默认参数:

// utils/request.js
import axios from 'axios';

const instance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 10000,
});

// 请求拦截器
instance.interceptors.request.use(config => {
  config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
  return config;
});

// 响应拦截器
instance.interceptors.response.use(
  response => response.data,
  error => {
    console.error('API Error:', error);
    return Promise.reject(error);
  }
);

export default instance;

自定义hook封装

创建useFetch钩子管理请求状态:

// hooks/useFetch.js
import { useState, useEffect } from 'react';
import request from '../utils/request';

function useFetch(url) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      setLoading(true);
      try {
        const result = await request.get(url);
        setData(result);
      } catch (err) {
        setError(err);
      } finally {
        setLoading(false);
      }
    };

    fetchData();
  }, [url]);

  return { data, loading, error };
}

export default useFetch;

高阶组件封装

通过HOC包装组件提供请求能力:

// hocs/withRequest.js
import React from 'react';
import request from '../utils/request';

function withRequest(WrappedComponent) {
  return function WithRequest(props) {
    const [data, setData] = React.useState(null);

    const fetchData = async (url) => {
      try {
        const result = await request.get(url);
        setData(result);
      } catch (error) {
        console.error(error);
      }
    };

    return <WrappedComponent {...props} data={data} fetchData={fetchData} />;
  };
}

export default withRequest;

请求工厂函数

创建不同类型的请求方法:

// services/api.js
import request from '../utils/request';

export const getUsers = (params) => request.get('/users', { params });
export const createUser = (data) => request.post('/users', data);
export const updateUser = (id, data) => request.put(`/users/${id}`, data);

关键优化点

  • 错误处理:统一在拦截器中处理HTTP错误码和业务错误码
  • 取消请求:使用AbortController避免组件卸载后的内存泄漏
  • TypeScript支持:为请求函数添加类型定义
  • 缓存策略:根据需要实现SWR或缓存去重
  • Mock适配:开发环境注入Mock服务拦截请求

使用示例

组件内调用自定义hook:

function UserList() {
  const { data, loading, error } = useFetch('/users');

  if (loading) return <div>Loading...</div>;
  if (error) return <div>Error!</div>;

  return (
    <ul>
      {data?.map(user => <li key={user.id}>{user.name}</li>)}
    </ul>
  );
}

react如何封装请求

标签: react
分享给朋友:

相关文章

react实现vue

react实现vue

React 实现 Vue 功能 React 和 Vue 是两种不同的前端框架,但可以通过一些方法在 React 中实现 Vue 的特性。以下是几种常见 Vue 功能在 React 中的实现方式: 双…

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修改…

react性能如何

react性能如何

React 性能特点 React 通过虚拟 DOM(Virtual DOM)和高效的 diff 算法优化性能。虚拟 DOM 减少了直接操作真实 DOM 的开销,仅在必要时更新变化的部分。React 的…

react如何验证

react如何验证

表单验证方法 在React中验证表单数据通常使用以下几种方式: 内置HTML5验证 利用HTML5原生表单验证属性如required、pattern等,结合form.noValidate属性禁用浏览…

react 如何运行

react 如何运行

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

react如何拓展

react如何拓展

React 拓展方法 使用高阶组件(HOC) 高阶组件是一种复用组件逻辑的方式,通过接收一个组件并返回一个新组件实现功能拓展。例如,为组件添加日志功能: function withLoggin…