在Vue中,组件之间有多种通信方式,下面列举其中的几种:
父子组件通信:通过props和$emit实现。父组件通过props向子组件传递数据,子组件通过$emit触发事件并传递数据给父组件。
父组件代码:
<template>
<div>
<child :message="parentMessage" @child-event="handleChildEvent"></child>
</div>
</template>
<script>
import Child from './Child.vue'
export default {
components: {
Child
},
data() {
return {
parentMessage: 'Hello from parent'
}
},
methods: {
handleChildEvent(message) {
console.log(message)
}
}
}
</script>
子组件代码:
<template>
<div>
<button @click="handleClick">Send Message to Parent</button>
</div>
</template>
<script>
export default {
props: {
message: String
},
methods: {
handleClick() {
this.$emit('child-event', 'Hello from child')
}
}
}
</script>
子父组件通信:通过$emit和$parent实现。子组件通过$emit触发事件并传递数据给父组件,父组件通过$parent访问子组件实例并调用其方法。
父组件代码:
<template>
<div>
<child ref="child"></child>
<button @click="handleClick">Call Child Method</button>
</div>
</template>
<script>
import Child from './Child.vue'
export default {
components: {
Child
},
methods: {
handleClick() {
this.$refs.child.childMethod('Hello from parent')
}
}
}
</script>
子组件代码:
<template>
<div>
</div>
</template>
<script>
export default {
methods: {
childMethod(message) {
console.log(message)
}
}
}
</script>
兄弟组件通信:通过一个空的Vue实例作为中央事件总线(event bus)实现。兄弟组件都引入该实例,一个组件通过事件触发器向实例发布事件,另一个组件通过事件监听器接收并响应该事件。
中央事件总线代码:
import Vue from 'vue'
export const bus = new Vue()
兄弟组件代码:
<template>
<div>
<button @click="handleClick">Send Message to Brother</button>
</div>
</template>
<script>
import { bus } from './bus'
export default {
methods: {
handleClick() {
bus.$emit('brother-event', 'Hello from brother A')
}
}
}
</script>