如何在VUE 2.0组件之间创建带有事件的钩子
How to create a hook with events between VUE 2.0 components
创建了两个动态组件。现在,使用事件:$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/如果有人对如何处理这个问题有任何建议,我将不胜感激:)
从技术上讲,您应该使用文档中给出的非父子通信。
但是在您当前的示例中,它将不起作用。原因:当你来回移动时,你的组件"一"answers"二"正在被创建和销毁。
这是你更新的jsFiddle: https://jsfiddle.net/mani04/yuh71e1o/4/。修改如下:
事件总线:
var bus = new Vue();
从组件1发送事件:
bus.$emit('selected', someObj);
组件二接收事件:
created: function() {
console.log("Created component-two, listening for 'selected' event");
bus.$on('selected', this.logThat);
}
如果您打开开发控制台并观察日志,您将注意到组件2被创建了多次,而旧的组件继续侦听,因为它们没有完全销毁。
要克服这个问题,您需要远离动态组件,并在根模板上同时创建component-one
和component-two
。您可以根据您想要的视图显示/隐藏,使用v-show
(而不是v-if
,它再次破坏组件实例)。然后,您可以使用事件总线进行通信,详见非父子通信文档。
相关文章:
- 在创建对象后附加一个jquery事件
- 动态创建OnClick事件Javascript
- 谷歌地图动态创建的标记点击事件使用相同的标记
- 如何在javascript中创建自定义事件
- 在动态创建的标记上添加事件
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 如何在Ol3弹出窗口中添加用javascript创建的按钮上的点击事件
- 如何在jQuery Mobile 1.4 Datepicker中创建事件
- 使用jQuery删除动态创建的元素上的mouseenter事件
- 如何使用我的Jquery代码创建委托事件侦听器
- 什么'是在HTML5画布中创建关键事件的最佳方式
- 如何在动态创建元素的内联onclick事件中传递对象
- 将Backbone.View重新注入DOM,保留事件而不是创建新事件
- 使用 noUiSlider 通过点击事件创建范围时出错
- 两个同步事件创建了一个无限循环
- 使用jQuery定义onInput事件创建元素
- 事件创建中的Javascript绑定对象
- 为已发出的事件创建侦听器时的闭包问题
- 如何为必应地图事件创建闭包
- 为事件创建单元测试