【问题标题】:How to emit an event with Vue.js inside the bootstrap?如何在引导程序中使用 Vue.js 发出事件?
【发布时间】:2017-09-12 02:39:39
【问题描述】:

我想要什么

如果有请求,我想发出一个事件,如果有响应,我想发出另一个事件,并在我的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)
  })
})

App.vue

<template>
  <div v-on:request="doStuff">
    <navigation-bar></navigation-bar>
    <router-view></router-view>
  </div>
</template>

我收到此错误:

TypeError: __WEBPACK_IMPORTED_MODULE_0_vue___default.a.$emit 不是 功能


讨论后的新 App.vue

<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>

【问题讨论】:

  • 要发出你需要一个 Vue 实例 new Vue()Vue 如果 console.logged 是一个函数。所以错误。
  • 谢谢你,@AmreshVenugopal!常量 app 已经创建了一个 vue 实例。这还不够吗?
  • EventBus.$on('request', this.invokeLoading()) 请不要调用该函数。您需要按原样传递函数,例如:EventBus.$on('request', this.invokeLoading)
  • 是的,是的,是的!现在可以了 :) 你是我的英雄!

标签: javascript vue.js vue-resource


【解决方案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()

您可以阅读有关eventBuses 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.
    }
  }
}

在这里,应用组件在创建应用组件的那一刻开始监听这两个事件。您可以使用其他 life-cycle 钩子,但由于这些事件是由单独的 Vue 实例发出的,即 bus 您不能执​​行以下操作:&lt;div v-on:request="doStuff"&gt;...&lt;/div&gt;

【讨论】:

  • 非常感谢!我无法在我的App.vue 中听到它,有什么想法吗? &lt;div v-on:request="dofStuff"&gt;&lt;/div&gt;
  • @Julian 我会添加那部分。
  • 非常酷,它现在关闭了;)它正在工作,但是在它之后我收到了很多错误:vue-resource.common.js?2f13:288 TypeError: Cannot read property 'apply'未定义的 完整图像:blob:imgur.com/4e33b155-839b-45ea-95a3-7c9f834557d6 我也用bus.$on 尝试过。
  • 可能跟功能有关。 chat.stackoverflow.com/rooms/141404/tempwing我们可以在这里讨论。
  • 谢谢,一旦聊天恢复正常我会联系你(无法登录)。
猜你喜欢
  • 2021-12-01
  • 2020-02-22
  • 2015-07-26
  • 2017-10-22
  • 1970-01-01
  • 2021-06-04
  • 2021-11-29
  • 2019-12-12
  • 2018-11-15
相关资源
最近更新 更多