想象一下:你正在建造一个动态展示猫咪图片的 React 应用(毕竟谁能抗拒猫猫呢🐱)。当用户点击按钮时,你需要不刷新整个页面就获取新图片------这就是 Ajax 和 Axios 大显身手的时候!
第一章:Ajax - 异步魔法师 🧙♂️
什么是 Ajax?
-
全称:Asynchronous JavaScript and XML(异步 JavaScript 和 XML)
-
超能力 :让网页偷偷与服务器通信,不用刷新整个页面!
-
经典场景:
javascript// 传统方式:整个页面刷新 → 用户体验卡顿 location.reload(); // Ajax方式:只更新需要变化的部分 → 如丝般顺滑 fetchNewCatImage();
Ajax 工作原理:

为什么 React 需要 Ajax?
React 组件需要数据才能展示内容!Ajax 就是那个帮你:
- 从 API 获取数据
- 提交表单数据
- 实时更新内容
的幕后英雄。
第二章: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 黄金法则 💎
-
数据放哪?
- 请求放在
useEffect
或 事件处理函数中 - 数据存入
useState
/useReducer
/ 状态管理库
- 请求放在
-
Loading & Error 状态
永远给用户反馈:
jsxconst [loading, setLoading] = useState(false); const [error, setError] = useState(null); // 请求开始:setLoading(true) // 请求成功:setLoading(false) // 请求失败:setError(err), setLoading(false)
-
密钥管理
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 + 加载状态 = 完美数据流!