当 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 + 加载状态 = 完美数据流!

相关推荐
一只小风华~38 分钟前
Web前端:JavaScript和CSS实现的基础登录验证功能
前端
90后的晨仔38 分钟前
Vue Router 入门指南:从零开始实现前端路由管理
前端·vue.js
LotteChar1 小时前
WebStorm vs VSCode:前端圈的「豆腐脑甜咸之争」
前端·vscode·webstorm
90后的晨仔1 小时前
零基础快速搭建 Vue 3 开发环境(附官方推荐方法)
前端·vue.js
洛_尘1 小时前
Java EE进阶2:前端 HTML+CSS+JavaScript
java·前端·java-ee
孤独的根号_1 小时前
Vite背后的技术原理🚀:为什么选择Vite作为你的前端构建工具💥
前端·vue.js·vite
一嘴一个橘子1 小时前
react 路由 react-router-dom
react.js
吹牛不交税2 小时前
Axure RP Extension for Chrome插件安装使用
前端·chrome·axure
薛定谔的算法2 小时前
# 前端路由进化史:从白屏到丝滑体验的技术突围
前端·react.js·前端框架
拾光拾趣录3 小时前
Element Plus表格表头动态刷新难题:零闪动更新方案
前端·vue.js·element