Vue 3 Ajax 请求(Axios)教程
1. 什么是 Axios?
Axios 是一个基于 Promise 的 HTTP 客户端,可以用于在 Vue 3 项目中发送 AJAX 请求。它支持:
- GET/POST/PUT/DELETE 等 HTTP 方法
- 请求和响应拦截器
- 自动转换 JSON 数据
- 取消请求
- 超时处理
- 并发请求
2. 安装 Axios
如果你使用的是 Vue 3 项目,需要先安装 Axios:
npm install axios
或者使用 yarn:
yarn add axios
如果使用 CDN 引入:
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
3. 在 Vue 3 组件中使用 Axios
Vue 3 主要有两种方式处理 AJAX 请求:
- 在
setup()
里直接使用 Axios - 封装 Axios 到
composables
可复用函数
4. 在 setup()
里直接使用
4.1 发送 GET 请求
<template>
<div>
<h2>用户列表</h2>
<ul>
<li v-for="user in users" :key="user.id">{{ user.name }}</li>
</ul>
</div>
</template>
<script>
import { ref, onMounted } from 'vue';
import axios from 'axios';
export default {
setup() {
const users = ref([]);
const fetchUsers = async () => {
try {
const response = await axios.get('https://jsonplaceholder.typicode.com/users');
users.value = response.data;
} catch (error) {
console.error('请求失败:', error);
}
};
onMounted(fetchUsers);
return { users };
}
};
</script>
解析
users
是响应式数据,存储从 API 获取的用户列表。fetchUsers
使用axios.get()
发送请求,成功后将数据赋值给users
。onMounted()
组件挂载时调用fetchUsers()
。
4.2 发送 POST 请求
<template>
<div>
<h2>创建用户</h2>
<input v-model="newUser.name" placeholder="输入用户名">
<button @click="createUser">提交</button>
</div>
</template>
<script>
import { ref } from 'vue';
import axios from 'axios';
export default {
setup() {
const newUser = ref({ name: '' });
const createUser = async () => {
try {
const response = await axios.post('https://jsonplaceholder.typicode.com/users', newUser.value);
console.log('创建成功:', response.data);
} catch (error) {
console.error('创建失败:', error);
}
};
return { newUser, createUser };
}
};
</script>
解析
newUser
是用户输入的数据。createUser
发送POST
请求,将newUser
传递到服务器。
4.3 发送 DELETE 请求
const deleteUser = async (id) => {
try {
await axios.delete(`https://jsonplaceholder.typicode.com/users/${id}`);
console.log('删除成功');
} catch (error) {
console.error('删除失败:', error);
}
};
5. 封装 Axios 成 composables
为了让 AJAX 逻辑更加清晰,可以封装到可复用的 composables
函数中。
5.1 创建 useUsers.js
// src/composables/useUsers.js
import { ref, onMounted } from 'vue';
import axios from 'axios';
export function useUsers() {
const users = ref([]);
const fetchUsers = async () => {
try {
const response = await axios.get('https://jsonplaceholder.typicode.com/users');
users.value = response.data;
} catch (error) {
console.error('请求失败:', error);
}
};
onMounted(fetchUsers);
return { users, fetchUsers };
}
5.2 在组件中使用
<template>
<div>
<h2>用户列表</h2>
<ul>
<li v-for="user in users" :key="user.id">{{ user.name }}</li>
</ul>
</div>
</template>
<script>
import { useUsers } from '../composables/useUsers.js';
export default {
setup() {
const { users } = useUsers();
return { users };
}
};
</script>
6. 配置全局 Axios
如果多个组件都会用到 Axios
,可以配置全局 Axios
实例。
6.1 在 main.js
中配置
import { createApp } from 'vue';
import App from './App.vue';
import axios from 'axios';
const app = createApp(App);
// 配置全局 Axios 实例
axios.defaults.baseURL = 'https://jsonplaceholder.typicode.com';
axios.defaults.timeout = 5000; // 超时时间 5 秒
app.config.globalProperties.$axios = axios;
app.mount('#app');
6.2 在组件中使用全局 Axios
<script>
export default {
setup(_, { proxy }) {
const fetchData = async () => {
const response = await proxy.$axios.get('/users');
console.log(response.data);
};
return { fetchData };
}
};
</script>
7. 使用 Axios 请求拦截器
拦截器可以在请求发送前或收到响应后进行处理。
7.1 添加请求拦截器
axios.interceptors.request.use(
(config) => {
console.log('请求发送:', config);
config.headers.Authorization = 'Bearer token';
return config;
},
(error) => {
return Promise.reject(error);
}
);
7.2 添加响应拦截器
axios.interceptors.response.use(
(response) => {
console.log('响应数据:', response);
return response;
},
(error) => {
console.error('响应错误:', error);
return Promise.reject(error);
}
);
8. 取消请求
如果用户切换页面时不希望请求继续,可以使用 AbortController
取消请求。
const controller = new AbortController();
axios.get('/users', { signal: controller.signal }).catch((error) => {
if (error.name === 'AbortError') {
console.log('请求已取消');
}
});
// 取消请求
controller.abort();
9. 处理 Axios 错误
const fetchData = async () => {
try {
const response = await axios.get('/invalid-url');
console.log(response.data);
} catch (error) {
if (error.response) {
console.error('服务器错误:', error.response.status);
} else if (error.request) {
console.error('无响应:', error.request);
} else {
console.error('请求错误:', error.message);
}
}
};
10. 总结
功能 | 示例 |
---|---|
GET 请求 | axios.get(url) |
POST 请求 | axios.post(url, data) |
DELETE 请求 | axios.delete(url) |
全局 Axios | axios.defaults.baseURL = 'xxx' |
拦截器 | axios.interceptors.request.use() |
取消请求 | controller.abort() |
Vue 3 推荐使用 Composition API
结合 Axios
来管理请求逻辑,这样可以提高可维护性和可复用性。
发表回复