我有这段代码:
HTML
<div id="app">
{{text}}
<my-component></my-component>
</div>
JS
Vue.component('my-component', {
template: '<button @click="click">Click me</button>',
methods: {
click() {
this.$emit('send', 'bye')
}
}
})
new Vue({
el: "#app",
data: {
text: "hello"
},
created() {
this.$on('send', (text) => {
this.text = text;
})
}
})
工作示例:https://jsfiddle.net/rjurado/y4yf6nve/
为什么事件send
不起作用?
答案 0 :(得分:31)
父组件可以使用v-on
直接侦听从子组件发出的事件。
<强> HTML 强>
<div id="app">
{{text}}
<my-component v-on:send="sendText"></my-component>
</div>
<强> JS 强>
Vue.component('my-component', {
template: '<button @click="click">Click me</button>',
methods: {
click() {
this.$emit('send', 'bye')
}
}
})
new Vue({
el: "#app",
data: {
text: "hello"
},
methods: {
sendText(text) {
alert(text)
}
}
})
答案 1 :(得分:27)
this.$emit
仅指Vue组件。您需要使用root
instance属性与根实例中的组件进行通信。所以基本上为事件添加root:
this.$root.$emit('send', 'bye')
this.$root.$on('send', (text) => {
this.text = text;
})
工作示例:jsFiddle
更好的方法是使用中央事件总线:docs
var bus = new Vue();
Vue.component('my-component', {
template: '<button @click="click">Click me</button>',
methods: {
click() {
bus.$emit('send', 'bye')
}
}
})
new Vue({
el: "#app",
data: {
text: "hello"
},
created() {
bus.$on('send', (text) => {
this.text = text;
})
}
})
工作示例:jsFiddle
答案 2 :(得分:4)
对于将来的引用,自定义事件名称不能是camelCased。
使用this.$emit('send_event', 'bye')
代替this.$emit('sendEvent', 'bye')
https://github.com/vuejs/vue/issues/4044