如果我想“破解”Vue中的正常通信模式,我通常会这样做,特别是现在 .sync 不推荐使用,是创建一个处理组件之间通信的简单EventEmitter。来自我最近的一个项目:
.sync
import {EventEmitter} from 'events' var Transmitter = Object.assign({}, EventEmitter.prototype, { /* ... */ })
有了这个 Transmitter 您可以在任何组件中执行的对象:
Transmitter
import Transmitter from './Transmitter' var ComponentOne = Vue.extend({ methods: { transmit: Transmitter.emit('update') } })
并创建一个“接收”组件:
import Transmitter from './Transmitter' var ComponentTwo = Vue.extend({ ready: function () { Transmitter.on('update', this.doThingOnUpdate) } })
同样,这是真正特定的用途。不要将整个应用程序基于此模式,使用类似的东西 Vuex 代替。
Vuex
好的,我们可以通过父母使用兄弟姐妹之间的沟通 v-on 事件。
v-on
Parent |-List of items //sibling 1 - "List" |-Details of selected item //sibling 2 - "Details"
我们假设我们想要更新 Details 单击某个元素时的组件 List 。
Details
List
在 Parent :
Parent
模板:
<list v-model="listModel" v-on:select-item="setSelectedItem" ></list> <details v-model="selectedModel"></details>
这里:
v-on:select-item
setSelectedItem
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>
//... 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