在 Vue 项目中使用 Axios 进行 API 请求时,如果需要在离开页面时取消未完成的请求,可以使用 Axios 的 CancelToken 功能。以下是一个示例,演示如何在 Vue 组件中实现这一功能。
首先,确保你已经安装了 Axios:
接下来,按照以下步骤在你的 Vue 组件中使用
接下来,按照以下步骤在你的 Vue 组件中使用 CancelToken:
在组件中创建一个 CancelToken 实例。
在 beforeDestroy 或 beforeRouteLeave 钩子中取消请求。
<template>
<div>
<!-- Your component template -->
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
cancelTokenSource: null
};
},
created() {
// 创建CancelToken实例
this.cancelTokenSource = axios.CancelToken.source();
},
methods: {
fetchData() {
axios.get('https://api.example.com/data', {
cancelToken: this.cancelTokenSource.token
})
.then(response => {
console.log('Data:', response.data);
})
.catch(error => {
if (axios.isCancel(error)) {
console.log('Request canceled:', error.message);
} else {
console.error('Error:', error);
}
});
}
},
beforeDestroy() {
// 在组件销毁之前取消请求
if (this.cancelTokenSource) {
this.cancelTokenSource.cancel('Component is being destroyed.');
}
},
beforeRouteLeave(to, from, next) {
// 在离开路由之前取消请求
if (this.cancelTokenSource) {
this.cancelTokenSource.cancel('Route is changing.');
}
next();
}
};
</script>在这个示例中,我们在 created 钩子中创建了一个 CancelToken 实例,并在 beforeDestroy 和 beforeRouteLeave 钩子中取消请求。这样,当组件销毁或路由发生变化时,未完成的请求将被取消。
如果你使用的是 Vue 3,可以使用 onBeforeUnmount 组合式 API 来实现相同的功能:
<template>
<div>
<!-- Your component template -->
</div>
</template>
<script>
import axios from 'axios';
import { ref, onBeforeUnmount } from 'vue';
import { useRouter } from 'vue-router';
export default {
setup() {
const cancelTokenSource = ref(null);
const router = useRouter();
// 创建CancelToken实例
cancelTokenSource.value = axios.CancelToken.source();
const fetchData = () => {
axios.get('https://api.example.com/data', {
cancelToken: cancelTokenSource.value.token
})
.then(response => {
console.log('Data:', response.data);
})
.catch(error => {
if (axios.isCancel(error)) {
console.log('Request canceled:', error.message);
} else {
console.error('Error:', error);
}
});
};
// 在组件销毁之前取消请求
onBeforeUnmount(() => {
if (cancelTokenSource.value) {
cancelTokenSource.value.cancel('Component is being destroyed.');
}
});
// 在离开路由之前取消请求
router.beforeEach((to, from, next) => {
if (cancelTokenSource.value) {
cancelTokenSource.value.cancel('Route is changing.');
}
next();
});
return {
fetchData
};
}
};
</script>在这个示例中,我们做了以下事情:
使用 ref 创建一个可响应的 cancelTokenSource 变量来存储 CancelToken 实例。
在 setup 函数中创建 CancelToken 实例。
使用 axios.get 发送请求,并将 cancelToken 添加到请求配置中。
使用 onBeforeUnmount 钩子,在组件卸载之前取消未完成的请求。
使用 router.beforeEach 钩子,在路由变化之前取消未完成的请求。
通过这种方式,你可以确保在 Vue 3 组件销毁或路由变化时取消未完成的 Axios 请求,避免不必要的资源消耗和潜在的问题。