gpt4 book ai didi

vue.js - 如何在 vue.js 1.0.x 中使用全局事件总线?

转载 作者:搜寻专家 更新时间:2023-10-30 22:22:16 26 4
gpt4 key购买 nike

我正在尝试创建一个带有空 new Vue 的事件总线实例。该应用程序足够大,可以拆分为多个组件文件。例如,我的应用程序结构如下:

主.js

import Vue from vue;  
window.bus = new Vue();
Vue.component('update-user', require('./components/update-user');
Vue.component('users-list', require('./components/users-list');
Vue.component('edit-user', require('./components/edit-user');
Vue.component('user-address', require('./components/user-address');

new Vue({
el:'body',
ready(){

}
});

组件/更新用户.js

export default{
template: require('./update-user.template.html'),
ready(){
bus.$emit('test-event', 'This is a test event from update-user');
}
}

组件/用户列表.js

export default{
template:require('./users-list.template.html'),
ready(){
bus.$on('test-event', (msg) => { console.log('The event message is: '+msg)});
//outputs The event message is: This is a test event
}

组件/edit-user.js

export default{
template:require('./edit-user.template.html'),
ready(){
bus.$on('test-event', (msg) => {console.log('Event message: '+msg)});
//doesn't output anything
console.log(bus) //output shows vue instance with _events containing 'test-event'
}
}

组件/用户地址.js

export default{
template:require('./user-address.template.html'),
ready(){
bus.$on('test-event', () => {console.log('Event message: ' +msg)});
//doesn't output anything
console.log(bus) //output shows vue instance with _events containing 'test-event'
}
}

index.html

...
<body>
<update-user>
<users-list></users-list>
<edit-user>
<user-address></user-address>
</edit-user>
</update-user>
</body>
...

我的问题是为什么 bus.$on仅在第一个子组件中工作?即使我从 <users-list> 中删除监听器, 其他组件都无法监听该事件,即 console.log() with bus.$on<users-list> i.e. the immediate child component 以下/之后的任何组件中均不起作用.
我是不是遗漏了什么或者哪里做错了?
如何让它工作,以便任何深度的任何子组件都可以监听从根组件或层次结构中更高层的任何位置发出的事件,反之亦然?

最佳答案

我弄明白了,并让它发挥作用。在这里发帖是为了帮助遇到这个问题的其他人。

其实我在问题上面提到的实现没有任何问题。当事件被触发时,我试图在一个尚未呈现的组件中监听事件(v-if 条件为假)。所以一秒钟后(事件被触发后)当组件被渲染时它无法监听事件 - 这是 Vue 中的预期行为(我在 laracasts 论坛上得到了回复)。

然而,我最终实现了稍微不同的方式(基于来自 Cody Mercer 的建议,如下所示:

import Vue from vue;

var bus = new Vue({});

Object.defineProperty(Vue.prototype, $bus, {
get(){
return this.$root.bus;
}
});

Vue.component('update-user', require('./components/update-user');
Vue.component('users-list', require('./components/users-list');
Vue.component('edit-user', require('./components/edit-user');
Vue.component('user-address', require('./components/user-address');

new Vue({
el:'body',
ready(){

},
data:{
bus:bus
}
});

现在要从任何组件访问事件总线,我可以使用 this.$bus as

this.$bus.$emit('custom-event', {message:'This is a custom event'});  

而且我可以从任何其他组件(如

)收听此事件
this.$bus.$on('custom-event', event => {
console.log(event.message);
//or I can assign the message to component's data property
this.message = event.message;

//if this event is intended to be handled in other components as well
//then as we normally do we need to return true from here
return true;
});

关于vue.js - 如何在 vue.js 1.0.x 中使用全局事件总线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38518958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com