vue.js - 如何最好地为非父子通信实例化第二个 Vue 实例

标签 vue.js

我正在通过一个教程来学习 Vue 2.0,并且刚刚完成了一个关于使用事件总线进行通信以允许与直接父组件以外的组件进行通信的类(class)。

教程中提供的代码给了我一个错误,但我能够自己解决它,我将在下面解释。我想了解“为什么”原始代码不起作用,尽管这只是为了我自己的学习和理解。

教程中给出的代码如下:

Window.Event = new Vue();

Vue.component('coupon', {

    template: '<input placeholder="Coupon Code" @blur="onCouponApplied">',

    methods: {
        onCouponApplied() {
            Event.$emit('applied');
        }
    }
});

var app = new Vue({
    el: '#root',

    created() {
        Event.$on('applied', () => alert('Handling it!'));
    }
});

当我尝试运行时,收到错误消息:“TypeError: Event.$on is not a function”。网上研究了一下,干脆把第一个Vue实例的实例化改成了:

var bus = new Vue();

然后引用emit/on如下:

bus.$emit('applied');

bus.$on('applied', () => alert('Handling it!'));

就我自己的理解而言,我希望能在以下方面提供一些帮助:

  1. 为什么原始的 Window.Event 格式对我不起作用 什么时候对其他人有用?
  2. 本教程的评论部分有一些评论 沿着使用 Window.Event 的路线作为不是最佳实践, 但他们没有解释原因。
  3. 我这样做的方式有什么问题吗? 不使用原版我会失去的任何功能 窗口事件?

谢谢!

最佳答案

如果教程确实推荐了这一行,

window.Event = new Vue()

然后他们推荐一个坏主意事件 是一个 native browser object ,即使你可以覆盖它,你也绝对不应该。您将替换许多其他库(可能包括 Vue 本身)所依赖的对象。

另一方面,如果您确实编写了这段代码

Window.Event = new Vue()

然后您将 Vue 对象添加到浏览器中的任何 Window 中。注意大写的 WWindowwindow 不同。小写的 window 是指所有浏览器中的全局对象。在 chrome 中,Window 指的是其他东西(不确定具体是什么)。

因此,当您尝试调用 Event.$on() 时,您引用的是我在上面链接的 native Event 对象,而不是您尝试创建的总线,这会导致您的错误。

关于vue.js - 如何最好地为非父子通信实例化第二个 Vue 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43171619/

相关文章:

javascript - 在 vue.js 中,每次都声明 "var ~ = new vue"?

vue.js - 我怎样才能让这个 v-tabs Vuetify.js 组件工作?

javascript - 带有 : not working 的 vuejs 组件事件

vue.js - 我们可以将数据从 django 模板发送到 vuejs 吗?

vue.js - 使用Vuejs动画创建向左滑动效果

php - 更改 Laravel Jetstream 应用程序中的 Logo

vue.js - Vue - 属性内插值

vue.js - 如何升级 sass-loader

javascript - 使用 Vuex 将数据绑定(bind)到组件

javascript - VueJS - 将带有 v-model 属性的动态appendChild添加到div?