【发布时间】:2017-01-28 11:37:30
【问题描述】:
我正在构建一个 Vue 组件,其中包含未指定数量的子组件。始终只有一个子组件可见,用户只能在当前可见的子组件发出is-valid 事件时在子组件之间切换。
我想保持这种解耦,这样孩子们不知道他们的父母,只能通过发出事件来交流。这也意味着子组件不知道他们在父组件中的位置。
因此,父组件必须以某种方式跟踪事件来自哪个子组件。如果事件来自右孩子(当前可见的那个),则激活一些按钮,允许用户转到下一个或上一个孩子。
到目前为止,这是我的代码:
HTML
<div id="app">
<template id="m-child">
<div>
<button v-on:click="setstate(true)">Valid</button>
<button v-on:click="setstate(false)">Invalid</button>
</div>
</template>
<template id="m-parent">
<div>
<m-child v-on:newstate="newchildstate"></m-child>
<m-child v-on:newstate="newchildstate"></m-child>
<m-child v-on:newstate="newchildstate"></m-child>
</div>
</template>
<m-parent></m-parent>
</div>
JS
Vue.component('m-child', {
template: '#m-child',
data: function() {
return {};
},
methods: {
setstate: function (valid) {
this.$emit('newstate', valid);
}
}
});
Vue.component('m-parent', {
template: '#m-parent',
methods: {
newchildstate: function (valid) {
console.log('valid:' + valid + ', but where from?');
}
}
});
new Vue({
el: '#app'
});
当然我可以在子事件绑定上硬编码一个索引:
<m-child v-on:newstate="newchildstate(0, $event)"></m-child>
<m-child v-on:newstate="newchildstate(1, $event)"></m-child>
<m-child v-on:newstate="newchildstate(2, $event)"></m-child>
但这会使整个设置变得不那么模块化,我只是希望能够在 DOM 中插入许多子节点并使其立即工作。
我查看了 Vue 事件的 API,似乎没有办法从事件对象中获取源代码。
【问题讨论】:
标签: javascript vue.js