好的,我們可以通過父母使用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。 –