如果有请求,我想发出一个事件,如果有响应,我想发出另一个事件,并在App.vue
内收听。
我正在使用VueResource
和内置拦截器:
import Vue from 'vue'
import VueResource from 'vue-resource'
Vue.http.interceptors.push((request, next) => {
next((response) => {
})
})
const app = new Vue({
render: h => h(App)
}).$mount('#app')
Vue.http.interceptors.push((request, next) => {
Vue.emit('request', request)
next((response) => {
Vue.emit('response', response)
})
})
<template>
<div v-on:request="doStuff">
<navigation-bar></navigation-bar>
<router-view></router-view>
</div>
</template>
我收到此错误:
TypeError:__ WWEPACK_IMPORTED_MODULE_0_vue ___ default.a。$ emit不是 功能
<template>
<div>
<router-view></router-view>
</div>
</template>
<script>
import EventBus from './EventBus'
export default {
created () {
EventBus.$on('request', this.invokeLoading())
EventBus.$on('response', this.stopLoading())
},
methods: {
invokeLoading () {
console.log('Start')
},
stopLoading () {
console.log('Stop')
},
}
}
</script>
答案 0 :(得分:1)
您可以使用eventBus
来处理此方案,例如:
import Vue from 'vue'
import VueResource from 'vue-resource'
import bus from 'path/to/event-bus'
Vue.http.interceptors.push((request, next) => {
bus.$emit('request', request)
next((response) => {
bus.$emit('response', response)
})
})
const app = new Vue({
render: h => h(App)
}).$mount('#app')
可以创建eventBus,如:
import Vue from 'vue'
export default new Vue()
您可以详细了解eventBus
es here。
你这样做的问题是:Vue
是一个构造函数,它本身没有emit
方法。
要监听任何组件中发出的事件,您需要导入eventBus。所以,假设应用程序组件:
import bus from 'path/to/event-bus'
export default {
created () {
bus.on('request', this.onRequest)
bus.on('response', this.onRequest)
},
methods: {
onRequest () {
// do something.
},
onResponse () {
// do something.
}
}
}
此处,app组件在创建app组件时开始侦听这两个事件。您可以使用其他life-cycle挂钩,但由于这些事件是由单独的Vue
实例发出的,bus
您无法执行以下操作:<div v-on:request="doStuff">...</div>