Vue.js 中的全局事件总线和通知
The Global Event Bus & notifications in Vue.js
我正在尝试创建一个全局事件总线,以便两个组件父子可以相互通信。我四处寻找;我已经阅读了很多关于 The Global Event Bus 良好模式的文章,但是,我找不到任何解决我的情况的方法。我想在我的应用程序中添加通知功能。这是一个文件 event.js,其中有不同类型的通知:
Event.js
import Vue from 'vue';
export default new Vue({
methods: {
notifySuccess(message) {
this.$emit('notify', 'success', message);
},
notifyInfo(message) {
this.$emit('notify', 'info', message);
},
notifyWarning(message) {
this.$emit('notify', 'warning', message);
},
notifyDanger(message) {
this.$emit('notify', 'danger', message);
},
requestError(error) {
if (error.response) {
this.notifyDanger(error.response.status + ': ' + error.response.statusText);
}
},
},
});
父组件如下所示
App.vue
<template>
<router-view></router-view>
</template>
<script>
import Event from './js/event.js';
export default {
name: 'app',
created() {
Event.$on('notify', (type, message) => alert(`${type}\n${message}`));
}
}
</script>
子组件如下所示
Header.vue
<template>
<a class="navbar-brand" href="#" @click.prevent="clickTest"></a>
</template>
<script>
name: 'header',
methods: {
clickTest() {
Event.$emit('notify', 'success', 'Hello World!');
}
}
</script>
我会在以后添加弹出窗口,例如 notifySuccess 以绿色显示弹出窗口,以红色显示 notifyDanger,以黄色显示 notifyWarning。
如何在子组件中创建一个 event/method 取决于 nostrification 类型?我做错了什么?
PS:抱歉我的英语不好。希望你能理解我。
将Event.$emit('notify', 'success', 'Hello World!');
替换为Event.notifySuccess('Hello World');
(您在Event.js
中定义了方法但没有使用它们)
并尽量避免使用内置或保留的 HTML 元素作为组件 ID(如 header
)
那么您的代码将毫无问题地运行。
参见 updated demo。
我正在尝试创建一个全局事件总线,以便两个组件父子可以相互通信。我四处寻找;我已经阅读了很多关于 The Global Event Bus 良好模式的文章,但是,我找不到任何解决我的情况的方法。我想在我的应用程序中添加通知功能。这是一个文件 event.js,其中有不同类型的通知:
Event.js
import Vue from 'vue';
export default new Vue({
methods: {
notifySuccess(message) {
this.$emit('notify', 'success', message);
},
notifyInfo(message) {
this.$emit('notify', 'info', message);
},
notifyWarning(message) {
this.$emit('notify', 'warning', message);
},
notifyDanger(message) {
this.$emit('notify', 'danger', message);
},
requestError(error) {
if (error.response) {
this.notifyDanger(error.response.status + ': ' + error.response.statusText);
}
},
},
});
父组件如下所示
App.vue
<template>
<router-view></router-view>
</template>
<script>
import Event from './js/event.js';
export default {
name: 'app',
created() {
Event.$on('notify', (type, message) => alert(`${type}\n${message}`));
}
}
</script>
子组件如下所示
Header.vue
<template>
<a class="navbar-brand" href="#" @click.prevent="clickTest"></a>
</template>
<script>
name: 'header',
methods: {
clickTest() {
Event.$emit('notify', 'success', 'Hello World!');
}
}
</script>
我会在以后添加弹出窗口,例如 notifySuccess 以绿色显示弹出窗口,以红色显示 notifyDanger,以黄色显示 notifyWarning。
如何在子组件中创建一个 event/method 取决于 nostrification 类型?我做错了什么?
PS:抱歉我的英语不好。希望你能理解我。
将Event.$emit('notify', 'success', 'Hello World!');
替换为Event.notifySuccess('Hello World');
(您在Event.js
中定义了方法但没有使用它们)
并尽量避免使用内置或保留的 HTML 元素作为组件 ID(如 header
)
那么您的代码将毫无问题地运行。
参见 updated demo。