根据您的组件层次结构以及您是否乐于使用状态管理(例如 Vuex),通常有三种方法可以处理此问题。
父/子
子组件发出事件到它们的父组件
<!-- parent -->
<template>
<Child @random-number-generated="captureRandomNumber"/>
</template>
<script>
export default {
data: () => ({ numbers: [] }),
methods: {
captureRandomNumber (num) {
this.numbers.push(num)
}
}
}
</script>
<!-- child -->
<template>
<button type="button" @click="$emit('random-number-generated', Math.random())">
Generate random number
</button>
</template>
兄弟姐妹
与父/子通信非常相似,可以使用兄弟组件的父级来协调数据,方法是在一些子级上监听事件并在其他子级上传递道具或调用方法
<!-- parent -->
<template>
<Child1 @some-event="handleEvent"/>
<Child2 :prop-name="values"/>
<Child3 ref="child3"/>
</template>
<script>
export default {
data: () => ({ values: [] }),
methods: {
handleEvent (payload) {
this.values.push(payload) // will reactively update the Child2 "propName" value
this.$refs.child3.someMethod(payload) // call a method on Child3
}
}
}
</script>
如果您的组件没有层次相关,则可以使用此选项。您可以创建一个新的Vue 实例来充当事件总线,也可以使用$root 实例。
通过$emit发布活动
// event bus
EventBus.$emit('event-name', payload)
// root instance
this.$root.$emit('event-name', payload)
并通过$on订阅活动
// event bus
EventBus.$on('event-name', handlerFunction)
// root instance
this.$root.$on('event-name', handlerFunction)
商店
最后,有一个Vuex Store 形式的集中管理状态,其中数据由组件提交 mutations(同步)或调度 actions 更改(异步)并且订阅者通过映射到 state 或 getters 来对更改做出反应。
组件只需位于同一根 Vue 实例下。他们的关系没有其他要求。