【发布时间】:2018-01-21 14:09:18
【问题描述】:
我有一个用 Vue (Webpack) 编写的 SPA,我想根据应用当前是否正在处理 HTTP 请求或响应来控制微调器的可见性。
按照一些教程,我想出了事件总线方案并做到了:
创建eventBus.js:
import Vue from 'vue';
export const eventBus = new Vue();
我将我的 axios 拦截器设置在 App.vue 的 created() 钩子中。以下是该组件中必要的功能:
data() {
return {
showLoader: false
};
},
created(){
this.setAxiosInterceptors();
// some code removed //
}
},
mounted() {
eventBus.$on('show-loader', () => {
this.showLoader = true;
});
eventBus.$on('hide-loader', () => {
this.showLoader = false;
});
},
methods: {
setAxiosInterceptors() {
var tokenCookieName = this.$store.getters.getCookieNames.apiToken;
var cookieDefaultValue = this.$store.getters.getCookieDefaultValue;
// token expired middleware
this.axios.interceptors.response.use(response => {
var data = response.data;
if(data.info.api_token) {
this.$cookie.set(tokenCookieName, data.info.api_token);
}
if(data.status == 'error' && data.info.login_failed) {
this.$cookie.set(tokenCookieName, cookieDefaultValue);
window.location = '/'; // not possible to use Vue router here
}
eventBus.$emit('hide-loader');
return response;
},
error => {
eventBus.$emit('hide-loader');
console.log('Response interception failed!');
return Promise.reject(error);
});
// attach API token middleware
this.axios.interceptors.request.use(config => {
var apiToken = this.$cookie.get(tokenCookieName);
if (!apiToken) {
apiToken = cookieDefaultValue;
}
config.headers.Authorization = 'Bearer ' + apiToken;
eventBus.$emit('show-loader');
return config;
},
error => {
eventBus.$emit('hide-loader');
console.log('Request interception failed!');
return Promise.reject(error);
}
);
}
}
请忽略一些与问题无关的代码,但我想展示一下是如何设置的。问题是,当我访问我的主页时,应用程序会不断发出启动 GET 请求,直到我的服务器返回 429 错误。
有趣的是,在我的 eventBus.$on 处理程序中,如果我只是执行 console.log,则不会出现这种行为(当然,微调器也不能正常工作)但是一旦我更改了变量或调用 vuex 动作,无限重新加载开始。
有什么线索吗?
【问题讨论】:
-
showLoader是否与v-if一起使用? -
created函数是否被重复调用,意味着组件正在被销毁和重新创建? -
@RoyJ 是的,
showLoader用于确定v-if和v-else以有条件地显示/隐藏微调器。我不确定如何确定组件是否被反复破坏:如果其他因素导致浏览器反复重新加载,destroyed函数仍将被调用。 -
尝试将您的组件放在
<keep-alive>标签中。 -
@RoyJ 你的意思是把我的整个
if-else包裹在keep-alive中还是只是微调器组件?