【问题标题】:How to create a hook with events between VUE 2.0 components如何在 VUE 2.0 组件之间创建带有事件的钩子
【发布时间】:2016-11-02 10:44:20
【问题描述】:

我创建了两个dynamic 组件。现在,使用events: $emit/$on 我需要的是触发组件的“logThat(someObj)”方法 - 两个传递参数,正如您在这个小提琴中看到的那样:

Vue.component('component-one', {
    template: '#template-a',
    methods: {
        onClick() {
            const someObj = {
                foo: "foo",
                bar: "bar"
            }

            vm.$emit('selected', someObj)
            vm.currentView ='component-two';
        }
    }
});

//Any hint??
/*vm.$on('selected', (someObj) => {
    this.logThat(someObj)
})*/

Vue.component('component-two', {
    template: '#template-b',
    methods: {
        onClick() {
            vm.currentView ='component-one';
        },
        logThat(someObj) {
            console.log(someObj);
       }
    }
});

https://jsfiddle.net/wanxe/yuh71e1o/

如果有人对如何处理这个问题有任何建议,我们将不胜感激:)

【问题讨论】:

    标签: javascript vue.js vue-component


    【解决方案1】:

    从技术上讲,您应该使用文档中给出的Non-parent-child communication

    但在您当前的示例中,它不起作用。原因:您的组件“一”和“二”在您来回移动时被创建和销毁。

    这是您更新的 jsFiddle:https://jsfiddle.net/mani04/yuh71e1o/4/。以下是更改:

    事件总线:

    var bus = new Vue();
    

    从组件一发送事件:

    bus.$emit('selected', someObj);
    

    在组件二中接收事件:

    created: function() {
       console.log("Created component-two, listening for 'selected' event");
       bus.$on('selected', this.logThat);
    }
    

    如果您打开开发控制台并观察日志,您会注意到组件 2 被多次创建,而旧的组件仍在监听,因为它们没有完全销毁。

    要克服这个问题,您需要远离动态组件,并在根模板上同时创建 component-onecomponent-two。您可以使用v-show(而不是再次破坏组件实例的v-if)根据您想要的任何视图显示/隐藏。然后就可以使用事件总线进行通信了,详见Non-parent-child communication docs

    【讨论】:

    • 首先,非常感谢您帮助我更好地理解动态组件。正如我在您的示例中看到的,当第一次触发组件 2 时,它仅被实例化,但不会触发“选定”事件。但是,第二次我得到了预期的结果。很明显,我需要使用静态组件并按照您告诉我的方式使用 v-show 进行切换。但是假设你有变量“ShowMe”,我在哪里声明?在vue的实例化中,在每一个组件中,都是?
    • 如果您点击第三次或第四次,您会注意到原始小提琴中更有趣的结果——旧的component-two 永远不会被破坏。相反,它每次都会重新创建,导致不可预测的结果。这是更新的小提琴:jsfiddle.net/mani04/yuh71e1o/5 - 在此,我使用v-show 来显示/隐藏组件,而不是在它们之间动态切换。在这里您会找到您期望的结果。
    • 太棒了!再次感谢!
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2019-01-14
    • 2022-01-06
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多