当 React 遇见数据获取:Ajax 与 Axios 的奇妙冒险 🚀

想象一下:你正在建造一个动态展示猫咪图片的 React 应用(毕竟谁能抗拒猫猫呢🐱)。当用户点击按钮时,你需要不刷新整个页面就获取新图片------这就是 Ajax 和 Axios 大显身手的时候!


第一章:Ajax - 异步魔法师 🧙‍♂️

什么是 Ajax?

  • 全称:Asynchronous JavaScript and XML(异步 JavaScript 和 XML)

  • 超能力 :让网页偷偷与服务器通信,不用刷新整个页面!

  • 经典场景

    javascript 复制代码
    // 传统方式:整个页面刷新 → 用户体验卡顿
    location.reload(); 
    
    // Ajax方式:只更新需要变化的部分 → 如丝般顺滑
    fetchNewCatImage(); 

Ajax 工作原理:

为什么 React 需要 Ajax?

React 组件需要数据才能展示内容!Ajax 就是那个帮你:

  1. 从 API 获取数据
  2. 提交表单数据
  3. 实时更新内容
    的幕后英雄。

第二章:Axios - Ajax 的超级进化版 🦸‍♂️

为什么选择 Axios?

虽然浏览器自带 fetch API,但 Axios 更加强大:

markdown 复制代码
| 特性         | Axios 🚀          | fetch 🧪          |
|--------------|------------------|------------------|
| 浏览器兼容性 | 更广泛 ✅         | 较新浏览器 ✅     |
| 请求取消     | 支持 ✅          | 需 AbortController ⚠️ |
| 自动JSON转换 | 自动 ✅          | 需手动 .json() ❌ |
| 错误处理     | 拦截 400/500 ✅  | 只拦截网络错误 ❌|
| 进度监控     | 支持 ✅          | 不支持 ❌        |

安装 Axios

bash 复制代码
npm install axios
# 或
yarn add axios

第三章:Axios 实战指南 - 获取猫咪图片 🐾

1️⃣ 基础 GET 请求(获取数据)

jsx 复制代码
import axios from 'axios';
import { useState, useEffect } from 'react';

function CatGallery() {
  const [cats, setCats] = useState([]);

  useEffect(() => {
    const fetchCats = async () => {
      try {
        // 👇 发起 GET 请求
        const response = await axios.get('https://api.thecatapi.com/v1/images/search?limit=10');
        setCats(response.data); // 数据在 response.data
      } catch (error) {
        console.error("Oops, 猫咪出逃了!", error);
      }
    };
    
    fetchCats();
  }, []);

  return (
    <div>
      {cats.map(cat => (
        <img key={cat.id} src={cat.url} alt="可爱猫咪" />
      ))}
    </div>
  );
}

2️⃣ POST 请求(提交数据)

jsx 复制代码
const uploadCat = async (catData) => {
  try {
    const response = await axios.post('/api/cats', catData, {
      headers: { 'Content-Type': 'multipart/form-data' }
    });
    console.log("猫咪入库成功🎉", response.data);
  } catch (error) {
    console.error("猫咪拒绝进入箱子😾", error.response.data);
  }
};

3️⃣ 高级技巧大放送 🔥

A. 拦截器 - 全局请求管家

javascript 复制代码
// 添加请求头(如认证 token)
axios.interceptors.request.use(config => {
  config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
  return config;
});

// 统一处理错误
axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 401) {
      alert("请重新登录!");
    }
    return Promise.reject(error);
  }
);

B. 并发请求 - 双倍效率

javascript 复制代码
const [catData, dogData] = await Promise.all([
  axios.get('https://api.cats.com'),
  axios.get('https://api.dogs.com')
]);

C. 取消请求 - 防止内存泄漏

javascript 复制代码
const source = axios.CancelToken.source();

axios.get('/api/cats', { cancelToken: source.token })
  .catch(err => {
    if (axios.isCancel(err)) {
      console.log("请求被取消:用户离开了页面");
    }
  });

// 在组件卸载时取消请求(React 重要!)
useEffect(() => {
  return () => source.cancel();
}, []);

第四章:Ajax/Axios 黄金法则 💎

  1. 数据放哪?

    • 请求放在 useEffect 或 事件处理函数中
    • 数据存入 useState / useReducer / 状态管理库
  2. Loading & Error 状态

    永远给用户反馈:

    jsx 复制代码
    const [loading, setLoading] = useState(false);
    const [error, setError] = useState(null);
    
    // 请求开始:setLoading(true)
    // 请求成功:setLoading(false)
    // 请求失败:setError(err), setLoading(false)
  3. 密钥管理

    API 密钥永远不要写在前端代码中!使用环境变量:

    bash 复制代码
    # .env 文件
    REACT_APP_CAT_API_KEY=your_secret_key
    go 复制代码
    ```jsx

    axios.get(https://api.cats.com?key=${process.env.REACT_APP_CAT_API_KEY})

    复制代码

终极总结 🏁

概念 角色 何时使用
Ajax 异步通信的 基础理念 理解底层机制时
Axios 功能强大的 HTTP 客户端 实际项目开发(首选!✨)
fetch 浏览器原生 API 小型项目/无复杂需求时

React 最佳拍档:Axios + useEffect/useState + 加载状态 = 完美数据流!

相关推荐
崔庆才丨静觅16 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606117 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了17 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅17 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅17 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅18 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment18 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅18 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊18 小时前
jwt介绍
前端
爱敲代码的小鱼18 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax