Vue.js axios拦截器与vuejs自定义组件集成,用于以通用方式显示错误消息

Vue.js axios拦截器与vuejs自定义组件集成,用于以通用方式显示错误消息,vue.js,vuejs2,vue-component,axios,Vue.js,Vuejs2,Vue Component,Axios,假设我们有下面的代码 axios.interceptors.response.use(function (response) { return response; }, function (error) { if (error.response.status === 400) { if (error.response.data.type === "fieldsValidationErrors") { openModal(modal.validationsFailedI

假设我们有下面的代码

axios.interceptors.response.use(function (response) {
  return response;
}, function (error) {
  if (error.response.status === 400) {
    if (error.response.data.type === "fieldsValidationErrors") {
      openModal(modal.validationsFailedInfo);
    } else {
      openModal(modal.cannotHandleServerResponse);
    }
  } else if(error.response.status === 403) {
    redirectToLoginScreen();
  } else {
    openModal(modal.errorOccurred);
  }
  return Promise.reject(error);
});
此代码包含在之前

const app1 = new Vue({...});
app1.init();
我还有另一个UI应用程序:

const app2 = new Vue({...});
app2.init();
axios拦截器在声明vue实例之前声明

在每个vue应用程序中,我都有一个
组件,用于接收来自应用程序的错误

在我拥有的
通知
组件中

Vue.component('notifications', {
  ...
  template: '<section v-if="messages.length > 0" id="notifications" class="notifications-outer-wrapper">\n' +
    '    <div class="user-notification-content well form-group" :class="{ \'notify-danger\': type === \'danger\', \'notify-success\': type === \'success\' }">\n' +
    '      <span class="fa fa-info-circle notificationIcon" aria-hidden="true"></span>\n' +
    '      &nbsp;\n' +
    '      <span v-if="type === \'danger\'">{{message}}</span>\n' +
    '    </div>\n' +
    '  </section>'
});
Vue.component('notifications'{
...
模板:'\n'+
“\n”+
“\n”+
“\n”+
“{{message}}}\n”+
“\n”+
'  '
});
目前,我正在使用情态动词来表示出了问题。我需要的是在
组件中显示错误消息,每个Vue实例都有一个通知组件

关于如何获得这种行为,您有什么想法吗?

您可以使用它在不同的实例之间进行通信

//创建一个新的事件总线实例
$eventBus=new Vue();
//将$eventBus设置为全局Vue变量
//必须在新Vue({el:…})之前完成
//在此之后,可以在所有Vue组件中使用此.$eventBus访问$eventBus实例
Vue.prototype.$eventBus=$eventBus;
axios.interceptors.response.use(函数(响应){
返回响应;
},函数(错误){
// ...
//出现错误时,发出打开模式事件,将pass消息添加为有效负载
$eventBus.emit('open-modal'{
键入:“错误”,
信息:“…”
});
});
Vue.component('通知'{
创建(){
//收听打开模式事件
此.$eventHub.$on('open-model'({
类型,
消息
}) => {
//打开模式等的逻辑。。。
});
},
在…之前{
此.$eventHub.$off('open-model');
},
});
const app1=新的Vue({/*…*/});
const app2=新的Vue({/*…*/});
您可以使用它在不同的实例之间进行通信

//创建一个新的事件总线实例
$eventBus=new Vue();
//将$eventBus设置为全局Vue变量
//必须在新Vue({el:…})之前完成
//在此之后,可以在所有Vue组件中使用此.$eventBus访问$eventBus实例
Vue.prototype.$eventBus=$eventBus;
axios.interceptors.response.use(函数(响应){
返回响应;
},函数(错误){
// ...
//出现错误时,发出打开模式事件,将pass消息添加为有效负载
$eventBus.emit('open-modal'{
键入:“错误”,
信息:“…”
});
});
Vue.component('通知'{
创建(){
//收听打开模式事件
此.$eventHub.$on('open-model'({
类型,
消息
}) => {
//打开模式等的逻辑。。。
});
},
在…之前{
此.$eventHub.$off('open-model');
},
});
const app1=新的Vue({/*…*/});
const app2=新的Vue({/*…*/});

这实际上取决于此拦截器的定义位置。它是否可以访问Vue组件?如果有,则只需将
元素指定为
ref
属性,然后通过
vm.$refs.
选择器设置其内部HTML。您能否创建一个最小的、具体的和可验证的示例?请参阅和。@Terry您所说的
是什么意思?它是否可以访问Vue组件?
我不确定您提到的
元素在哪里。它是否在组件的模板中?标记中的其他地方?在某种程度上,您的问题中没有足够的信息来帮助我们准确诊断您的问题或提供帮助。请更新您的问题。@Terry我已更新了初始问题。开发一个真正的工作示例将花费我太多的时间,我认为我在这一点上提供的内容足以概括我的案例。我已经创建了一个简单的示例,您可以以通用方式触发消息。这实际上取决于此拦截器的定义。它是否可以访问Vue组件?如果有,则只需将
元素指定为
ref
属性,然后通过
vm.$refs.
选择器设置其内部HTML。您能否创建一个最小的、具体的和可验证的示例?请参阅和。@Terry您所说的
是什么意思?它是否可以访问Vue组件?
我不确定您提到的
元素在哪里。它是否在组件的模板中?标记中的其他地方?在某种程度上,您的问题中没有足够的信息来帮助我们准确诊断您的问题或提供帮助。请更新您的问题。@Terry我已更新了初始问题。开发一个真正的工作示例将花费我太多的时间,我认为我在这一点上提供的内容足以全面了解我的案例。我已经创建了一个简单的示例,您可以用一种通用的方式触发消息。