使用React Query做为axios请求库的上层封装

本文探讨了如何使用React Query作为axios的封装库,解决服务端状态管理和请求中间态的问题。React Query提供便捷的缓存、更新及异步数据处理,减少全局状态管理的复杂性。它自动处理isLoading和isError状态,支持局部Loading,并优化请求性能。通过分离服务端状态,项目可以更加简洁高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在项目中,通常都需要跟服务端进行异步的数据交互,基本都是用到axios这个库来做请求,嗯,毕竟拥有80k star,明星项目

接下来,我们来回顾下axios在项目中的使用

以查询用户信息为例,我们会这样封装

async function requestUsers(){
  const {data} =await axios.get('/api/users');
  return data;
}

我们再用hooks再封装下这个请求,包括loading等中间态的封装,处理的优雅一点

import React, {useState,useEffect} from 'react';
import axios from 'axios';
function useUsersQuery(){
  const [data,setData] = useState([]);
  const [isLoading,setLoading] = useState(false);
  const [isError,setError] = useState(false)
  useEffect(()=>{
    (async()=>{
       setLoading(true);
       try{
          const {data} = await axios.get('/api/users');
          setData(data);
       } catch((()=>{
          setError(true);
       })
       setLoading(false);
    })()
  })
  return { 
     data,
     isLoading,
     isError
  };
}
function UserList(){
  const {data, isLoading,isError} = useUsersQuery();
  if (isLoad
### 如何在 React封装 Axios 实现 API 网络请求 为了实现更高效、可维护性和扩展性的 API 调用,可以在 React 项目中通过封装 Axios 来集中处理配置和逻辑。以下是具体的方法: #### 1. 创建 Axios 实例并设置基础参数 创建一个独立的文件用于初始化 Axios 的实例,并引入全局的基础 URL 和超时时间等配置。 ```javascript // services.js import axios from 'axios'; import { BASE_URL, TIMEOUT } from './config'; const instance = axios.create({ baseURL: BASE_URL, timeout: TIMEOUT, }); export default instance; ``` 此部分代码定义了一个 Axios 实例 `instance` 并设置了默认的基础路径和超时时间[^1]。 #### 2. 添加请求拦截器 利用 Axios 提供的拦截器功能,在每次发起请求前执行特定的操作,比如添加认证 Token 或者打印日志信息。 ```javascript // 请求拦截器 instance.interceptors.request.use( (config) => { console.log('Request intercepted:', config); // 假设存在 token,则附加到 headers 中 const token = localStorage.getItem('authToken'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => Promise.reject(error) ); ``` 上述代码展示了如何向 HTTP 头部加入授权令牌以便于服务端验证身份合法性。 #### 3. 定义响应拦截器 同样可以通过响应拦截器捕获返回的数据或者错误状态码来进行统一处理。 ```javascript // 响应拦截器 instance.interceptors.response.use( (response) => response.data, // 自动解析 data 属性作为最终结果 (error) => { if (error.response && error.response.status === 401) { alert('未登录或会话已过期!'); window.location.href = '/login'; // 强制跳转至登录页 } throw error; // 继续抛出异常让上层捕捉 } ); ``` 这段脚本实现了当收到服务器反馈的状态码为 401 (未经授权访问)时提示用户重新登录的功能。 #### 4. 使用封装后的 Axios 发起请求 最后一步是在组件内部实际调用这些预置好的方法完成数据获取工作。 ```javascript // Component.jsx import React, { useEffect } from 'react'; import hyRequire from '@/services'; function PageOne() { useEffect(() => { fetchHighScoreData(); }, []); const fetchHighScoreData = async () => { try { const result = await hyRequire.get('/home/highscore'); // 注意这里不需要传递额外的对象包裹 url 参数 console.log(result); } catch (err) { console.error(err.message || 'An unknown error occurred.'); } }; return <div>Page One</div>; } export default PageOne; ``` 在此处可以看到简化版的 GET 方法调用方式[^2]。 --- ### 总结 以上就是在 React 应用程序里边针对 RESTful APIs 利用 Axios 开展良好设计模式下的最佳实践方案说明文档内容摘要[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值