结合 Pinia / Redux 管理请求状态
在前端项目中,Axios 通常与状态管理库(如 Pinia、Redux)配合使用,以实现全局统一的请求状态(loading、error、data)管理。
这可以让组件逻辑更清晰,避免重复的请求控制代码。
一、在 Vue3 + Pinia 中使用 Axios
Pinia 是 Vue3 官方推荐的状态管理库,搭配 Axios 可以轻松管理异步数据请求。
1. 安装依赖
npm install pinia axios
`
在入口文件中注册 Pinia:
// main.js
import { createApp } from "vue";
import { createPinia } from "pinia";
import App from "./App.vue";
const app = createApp(App);
app.use(createPinia());
app.mount("#app");
2. 创建 Axios 实例
// src/utils/request.js
import axios from "axios";
const request = axios.create({
baseURL: "/api",
timeout: 8000,
});
request.interceptors.response.use(
(res) => res.data,
(err) => Promise.reject(err)
);
export default request;
3. 定义 Pinia Store
// src/stores/user.js
import { defineStore } from "pinia";
import request from "../utils/request";
export const useUserStore = defineStore("user", {
state: () => ({
list: [],
loading: false,
error: null,
}),
actions: {
async fetchUsers() {
this.loading = true;
this.error = null;
try {
const res = await request.get("/users");
this.list = res;
} catch (err) {
this.error = err.message || "请求失败";
} finally {
this.loading = false;
}
},
},
});
4. 在组件中使用
<template>
<div>
<button @click="fetchUsers">加载用户</button>
<p v-if="loading">加载中...</p>
<p v-if="error" class="error">{{ error }}</p>
<ul>
<li v-for="u in list" :key="u.id">{{ u.name }}</li>
</ul>
</div>
</template>
<script setup>
import { useUserStore } from "../stores/user";
const { list, loading, error, fetchUsers } = useUserStore();
</script>
✅ 优势:
- 统一管理加载与错误状态
- 方便复用与缓存
- 更好地解耦组件与请求逻辑
二、在 React + Redux Toolkit 中使用 Axios
Redux Toolkit 提供了 createAsyncThunk 来封装异步请求逻辑,非常适合与 Axios 结合使用。
1. 安装依赖
npm install @reduxjs/toolkit react-redux axios
2. 创建 Axios 实例
// src/api/request.js
import axios from "axios";
const request = axios.create({
baseURL: "/api",
timeout: 8000,
});
request.interceptors.response.use(
(res) => res.data,
(err) => Promise.reject(err)
);
export default request;
3. 定义 Slice 与异步请求
// src/store/userSlice.js
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import request from "../api/request";
export const fetchUsers = createAsyncThunk("users/fetch", async () => {
return await request.get("/users");
});
const userSlice = createSlice({
name: "user",
initialState: { list: [], loading: false, error: null },
reducers: {},
extraReducers: (builder) => {
builder
.addCase(fetchUsers.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(fetchUsers.fulfilled, (state, action) => {
state.loading = false;
state.list = action.payload;
})
.addCase(fetchUsers.rejected, (state, action) => {
state.loading = false;
state.error = action.error.message;
});
},
});
export default userSlice.reducer;
4. 配置 Store
// src/store/index.js
import { configureStore } from "@reduxjs/toolkit";
import userReducer from "./userSlice";
const store = configureStore({
reducer: {
user: userReducer,
},
});
export default store;
在入口文件中注入:
// main.jsx
import { Provider } from "react-redux";
import store from "./store";
import App from "./App";
ReactDOM.createRoot(document.getElementById("root")).render(
<Provider store={store}>
<App />
</Provider>
);
5. 在组件中使用
import React, { useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import { fetchUsers } from "../store/userSlice";
function UserList() {
const dispatch = useDispatch();
const { list, loading, error } = useSelector((state) => state.user);
useEffect(() => {
dispatch(fetchUsers());
}, [dispatch]);
if (loading) return <p>加载中...</p>;
if (error) return <p>错误:{error}</p>;
return (
<ul>
{list.map((u) => (
<li key={u.id}>{u.name}</li>
))}
</ul>
);
}
export default UserList;
三、Pinia vs Redux 对比
| 特性 | Pinia(Vue) | Redux Toolkit(React) |
|---|---|---|
| 语法风格 | 简洁、声明式 | 结构化、约束性强 |
| 异步请求支持 | 直接写在 actions 中 | createAsyncThunk 内置支持 |
| 状态管理方式 | 响应式(Reactive) | 不可变(Immutable) |
| 学习曲线 | 低 | 中等 |
| 类型支持 | 优秀(TS 友好) | 优秀(TS 原生) |
四、总结
- Pinia 适合 Vue3,逻辑直观,轻量易上手。
- Redux Toolkit 简化了 Redux 使用,推荐用于中大型 React 项目。
- 两者都可以与 Axios 无缝结合,实现统一请求与状态管理。
- 对复杂项目,可结合缓存、重试与全局错误提示模块进一步优化。
相关内容
- 缓存与重复请求优化 本章节介绍如何在前端项目中使用 Axios 优化请求缓存与防止重复请求,包括浏览器缓存、内存缓存、请求去重策略、拦截器结合缓存、缓存过期处理等方法,帮助提高接口...
- 前端容错与兜底策略 本章节讲解如何在前端使用 Axios 实现容错与兜底策略,包括请求失败处理、默认数据返回、全局错误提示、降级方案、备用接口调用等方法,确保应用在网络异常或接口异...
- 接口统一管理与类型定义 本章节介绍如何在前端项目中使用 Axios 统一管理接口请求,包括接口模块化、统一封装、请求类型定义、TypeScript 类型约束、接口文档维护及调用规范化。...
- 取消请求(CancelToken 与 AbortController) 本章节讲解如何在 Axios 中取消请求,包括使用 CancelToken 和 AbortController 两种方式,适用于用户快速切换页面或重复请求时,防...
- 同时发送多个请求(axios.all / axios.spread) 本章节讲解如何使用 Axios 同时发送多个请求,包括 axios.all 和 axios.spread 的使用方法,帮助前端项目高效处理并发请求,提高数据获取...
- 防止重复请求的策略 本章节讲解如何在 Axios 中防止重复请求,包括使用请求标识、拦截器和节流/防抖机制,避免用户多次触发同一接口导致的冗余请求,提高前端性能和接口稳定性。