第19章 网络请求与工具库
14 分钟阅读
第十九章 网络请求与工具库
任何一个不算玩具的Vue应用都需要和网络打交道——获取数据、提交表单、上传文件…没有网络请求的应用就像一家没有外卖的餐厅,功能再强也让人觉得少了点什么。本章我们聊聊Vue生态中的网络请求方案和一些实用工具库。
19.0 网络请求入门(小白必看)
在写第一个网络请求代码之前,我们先搞清楚几个最基本的问题:什么是 HTTP?什么是 API?为什么前端要"发请求"?
19.0.1 什么是 HTTP?
**HTTP(HyperText Transfer Protocol,超文本传输协议)**是浏览器和服务器之间通信的"语言"。当你访问一个网页时,浏览器(客户端)用 HTTP 向服务器说"我要看这个页面",服务器用 HTTP 回答"这是页面内容"。整个互联网的网页传输都靠 HTTP。
类比理解:HTTP 就像餐厅里的服务员。你(浏览器)对服务员(HTTP)说"我要一份宫保鸡丁",服务员把请求传到厨房(服务器),厨房做好后服务员再把菜端回来(响应)。服务员就是浏览器和服务器之间的中间人。
HTTP 请求有几个关键组成部分:
- URL(网址):告诉服务器"我要什么",比如
https://api.example.com/users - HTTP 方法:告诉服务器你想干什么,最常见的有:
GET:获取数据(像点菜,只看不改)POST:提交数据(像下单,创建新东西)PUT:更新数据(像修改订单)DELETE:删除数据(像退菜)
19.0.2 什么是 REST API?
**REST(Representational State Transfer)**是一种设计 API 的规范。按 REST 规范设计的 API,通常是这样的格式:
| HTTP 方法 | URL 格式 | 含义 |
|---|---|---|
GET | /users | 获取用户列表 |
GET | /users/123 | 获取 ID 为 123 的用户 |
POST | /users | 创建一个新用户 |
PUT | /users/123 | 更新 ID 为 123 的用户 |
DELETE | /users/123 | 删除 ID 为 123 的用户 |
REST 的核心思想:URL 表示"资源"(名词,如 users),HTTP 方法表示"操作"(动词,如 GET/POST)。这就是为什么 REST API 叫"表现层状态转移"——通过 HTTP 方法来转移资源的状态。
19.0.3 什么是请求和响应?
一个完整的 HTTP 交互是这样的:
sequenceDiagram
participant B as 浏览器
participant S as 服务器
participant DB as 数据库
B->>S: GET /api/users/123<br/>(HTTP 请求)
Note over B,S: 浏览器向服务器发送请求,<br/>包含 URL、HTTP方法、请求头等信息
S->>DB: 查询用户数据
DB-->>S: 返回用户记录
S-->>B: HTTP 200 OK<br/>{ id: 123, name: "小明", age: 25 }<br/>(HTTP 响应)
Note over B,S: 服务器返回响应,<br/>包含状态码(如200表示成功)和数据
Note over B,S: 浏览器收到响应数据后,JavaScript 就可以用这些数据更新页面了19.0.4 状态码是什么?
服务器返回响应时,会带一个状态码,表示"请求结果如何":
| 状态码 | 含义 | 举个例子 |
|---|---|---|
| 200 | 成功 | GET 用户信息成功 |
| 201 | 创建成功 | POST 新建用户成功 |
| 400 | 请求参数错误 | 提交的数据格式不对 |
| 401 | 未登录 / Token 过期 | 没带 Token 或 Token 无效 |
| 403 | 没有权限 | 登录了但没有权限访问 |
| 404 | 资源不存在 | 用户 ID 123 根本不存在 |
| 500 | 服务器内部错误 | 后端代码出 bug 了 |
记住几个关键的状态码:200 是成功,400 系列是客户端的问题(你发的东西有问题),500 系列是服务端的问题(服务器出错了)。
19.0.5 前端为什么需要发请求?
浏览器的 JavaScript 本身只能操作页面上的东西,不能直接访问数据库。网络请求就是 JavaScript 和服务器之间的桥梁——JavaScript 发一个请求给服务器,服务器查数据库,返回数据给 JavaScript,JavaScript 再用这些数据更新页面。
举一个实际场景:
- 用户在搜索框输入"Vue"
- JavaScript 发起
GET /api/search?q=Vue - 服务器在数据库里搜索"Vue"相关文章
- 服务器返回
{ results: [...] } - JavaScript 把这些结果渲染成 HTML 展示给用户
这就是一个完整的"前后端分离"的交互流程。
19.1 Axios 封装
19.1.1 为什么需要封装
直接用axios裸写当然可以,但当你需要:
- 统一添加token
- 处理401自动跳转登录
- 统一错误提示
- 请求重试
- 取消重复请求
的时候,你就会需要一个封装好的axios实例。
graph LR
A[组件] --> B[封装好的axios]
B --> C[添加Token]
B --> D[错误处理]
B --> E[Loading状态]
C --> F[发送请求]
F --> G{响应}
G -->|成功| H[返回数据]
G -->|401| I[跳转登录]
G -->|网络错误| J[重试]
H --> K[组件收到响应]19.1.2 基础封装
| |
19.1.3 请求重试机制
| |
19.1.4 取消请求
| |
19.1.5 API 模块化
| |
| |
19.1.6 在组件中使用
| |
19.2 Dayjs 时间处理
19.2.1 为什么选择 Dayjs
- 轻量:只有2KB,moment.js的替代品
- 不可变:所有操作返回新实例
- API兼容:和moment.js很相似,学习成本低
- TypeScript支持:类型定义完整
| |
19.2.2 基础用法
| |
19.2.3 相对时间
| |
19.2.4 常用工具函数
| |
19.3 Lodash-es 工具库
19.3.1 为什么用 lodash-es
- 按需引入:lodash-es支持tree-shaking
- TypeScript支持:类型定义完整
- 统一抽象:避免自己写边界case
| |
19.3.2 常用函数
| |
19.3.3 实际应用示例
| |
19.4 VueUse 核心API
19.4.1 VueUse 简介
VueUse是Vue Composition API的工具集,提供了大量实用的响应式函数:
| |
19.4.2 核心API
| |
19.4.3 useFetch - 响应式请求
| |
19.4.4 useLocalStorage 与 useSessionStorage
| |
19.4.5 useEventListener - 事件监听
| |
19.4.6 onClickOutside - 点击外部
| |
| |
19.4.7 useDebounceFn 与 useThrottleFn
| |
19.4.8 useIntersectionObserver - 懒加载
| |
| |
19.5 图标解决方案
19.5.1 方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| SVG 内联 | 无依赖,可定制 | 繁琐,代码多 | 少量图标 |
| Iconify | 丰富,一套多用 | 需要网络加载 | 快速开发 |
| UnoCSS图标 | 原子化,按需 | 配置复杂 | Tailwind项目 |
| Element Plus Icons | 配套完整 | 只能配合Elment | 使用Element的项目 |
19.5.2 Iconify 使用
| |
| |
19.5.3 SVG 组件封装
| |
| |
19.5.4 使用示例
| |
19.6 本章小结
本章我们介绍了Vue项目中的网络请求和工具库:
| 类别 | 工具 | 核心功能 |
|---|---|---|
| HTTP客户端 | Axios | 封装请求拦截、响应拦截、重试、取消 |
| 时间处理 | Dayjs | 格式化、相对时间、计算 |
| 工具库 | Lodash-es | 数组/对象/函数工具 |
| 响应式工具 | VueUse | 大量Vue Composition API工具函数 |
| 图标 | Iconify | 丰富的图标库支持 |
合理的工具选型能大大提升开发效率。但记住:工具是为人服务的,不要为了用某个"高级"工具而用它。选择熟悉且能满足需求的就好。
用Axios封装网络请求不是为了装高级,而是为了让错误处理和token管理在一处;用VueUse不是为了少写代码,而是为了让逻辑更容易复用。选择工具的标准永远是:它能不能解决我的问题。