【发布时间】:2018-11-18 23:44:26
【问题描述】:
我目前正在构建一个 vue 应用程序,并且正在使用 axios。我有一个加载图标,我会在每次调用之前显示并在之后隐藏。
我只是想知道是否有办法在全局范围内执行此操作,这样我就不必在每次调用时都编写显示/隐藏加载图标了?
这是我现在的代码:
context.dispatch('loading', true, {root: true});
axios.post(url,data).then((response) => {
// some code
context.dispatch('loading', false, {root: true});
}).catch(function (error) {
// some code
context.dispatch('loading', false, {root: true});color: 'error'});
});
我在 axios 文档上看到有“拦截器”,但我不知道它们是在全局级别还是在每次调用中。
我还看到了这篇关于 jquery 解决方案的帖子,但不确定如何在 vue 上实现它:
$('#loading-image').bind('ajaxStart', function(){
$(this).show();
}).bind('ajaxStop', function(){
$(this).hide();
});
【问题讨论】:
-
拦截器可以在全局范围内使用,也可以仅用于某些请求(如果您愿意)(只需 create an instance 与它们一起使用,并且仅在您希望请求更改加载状态时使用此实例)。但是......我不确定让每个请求打开和关闭加载状态的概念。在某些情况下,您可能希望同时运行多个请求。如果其中一个比另一个快,它会将加载状态设置为 false,而另一个仍处于挂起状态。在您的情况下可能不是问题,但考虑到这一点很重要。
-
是否有更通用的方法来检测是否有任何未决请求?
-
可能还有其他方法,但我能想到的一种方法是在您的商店(或其他地方,例如您初始化 axios)中有一个待处理的请求计数器。将其初始化为零,每次启动请求时,添加
1,并将加载状态设置为true。请求完成后(解决或拒绝),减去1,只有当计数器等于0时,才将加载状态设置为false。
标签: javascript vue.js vuejs2 axios