好的,我们可以通过父母使用v-on
事件进行兄弟姐妹之间的沟通。
Parent
|-List of items //sibling 1 - "List"
|-Details of selected item //sibling 2 - "Details"
假设我们要更新Details
组件时,我们在List
单击某个元素。
在
Parent
:
模板:
<list v-model="listModel"
v-on:select-item="setSelectedItem"
></list>
<details v-model="selectedModel"></details>
这里:
v-on:select-item
这是一个事件,将在List
组件调用(见下文);
setSelectedItem
这是一个Parent
的方法来更新selectedModel
;
JS:
//...
data() {
return {
listModel: ['a', 'b']
selectedModel: null
}
},
methods: {
setSelectedItem (item) {
this.selectedModel = item //here we change the Detail's model
},
}
//...
在List
:
模板:
<ul>
<li v-for="i in list"
:value="i"
@click="select(i, $event)">
<span v-text="i"></span>
</li>
</ul>
JS:
//...
data() {
return {
selected: null
}
},
props: {
list: {
type: Array,
required: true
}
},
methods: {
select (item) {
this.selected = item
this.$emit('select-item', item) // here we call the event we waiting for in "Parent"
},
}
//...
这里:
this.$emit('select-item', item)
将直接在父母通过select-item
送项目。和家长将其发送到Details
视图
'$ emit'用'V-model'组合来模拟'.sync'。我认为你应该去Vuex的方式 – eltonkamami
所以我也考虑过同样的担忧。我的解决方案是使用带有广播频道的事件发射器,该广播频道等同于'范围' - 即子/父母和兄弟设置使用相同的频道进行通信。在我的情况下,我使用无线电库http://radio.uxder.com/,因为它只是几行代码和它的防弹,但很多会选择节点EventEmitter。 –