Vue 是当今最流行的前端框架之一,它为我们提供了一种非常强大的组件化开发方式,能够极大地提高我们的开发效率。在 Vue 的组件化开发中,组件之间的通信处理非常重要。本文将对 Vue 中的组件通信技术进行详细介绍。
一、父组件向子组件传递数据
在 Vue 中,父组件向子组件传递数据使用的是 props 属性。在子组件中通过 props 属性接收父组件传递的数据。
父组件代码:
<template>
<div>
<child-component :msg="msg"></child-component>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
components: {
ChildComponent
},
data() {
return {
msg: 'Hello World!'
}
}
}
</script>子组件代码:
<template>
<div>{{ msg }}</div>
</template>
<script>
export default {
props: {
msg: {
type: String,
required: true
}
}
}
</script>这里通过在父组件中使用子组件标签的方式传递数据,子组件使用 props 属性接收父组件传递的数据,完成数据传递。
二、子组件向父组件传递数据
子组件向父组件传递数据可以使用自定义事件和 $emit 方法实现。
子组件代码:
<template>
<div>
<button @click="sendMessage">发送消息</button>
</div>
</template>
<script>
export default {
methods: {
sendMessage() {
this.$emit('send-message', 'Hello Parent!')
}
}
}
</script>这里通过定义一个方法,使用 $emit 方法传递自定义事件和需要传递的数据。
父组件代码:
<template>
<div>
<child-component @send-message="receiveMessage"></child-component>
<div>{{ message }}</div>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
components: {
ChildComponent
},
data() {
return {
message: ''
}
},
methods: {
receiveMessage(msg) {
this.message = msg
}
}
}
</script>这里在父组件中使用子组件标签,监听子组件发送的自定义事件,使用 receiveMessage 方法接收子组件传递的消息。
三、兄弟组件之间的通信
在兄弟组件之间的通信中,因为它们没有父子关系,所以不能像父子组件之间通信那样直接使用 props 和 $emit 方法进行通信,需要使用 Vue 中另外一种通信方式:事件总线。
事件总线是一个自定义的 Vue 实例,用于兄弟组件之间的通信。在一个组件中,我们可以使用 $emit 方法向事件总线发送自定义事件,另一个组件可以通过 $on 方法监听并接收事件。
事件总线代码:
import Vue from 'vue' export default new Vue();
这里通过一个单独的文件创建一个事件总线。
组件 A 代码:
<template>
<div>
<button @click="sendMessage">发送消息</button>
</div>
</template>
<script>
import EventBus from '../utils/eventBus'
export default {
methods: {
sendMessage() {
EventBus.$emit('send-message', 'Hello B!')
}
}
}
</script>这里在组件 A 中发送消息,使用 EventBus.$emit 方法向事件总线发送自定义事件。
组件 B 代码:
<template>
<div>{{ message }}</div>
</template>
<script>
import EventBus from '../utils/eventBus'
export default {
data() {
return {
message: ''
}
},
mounted() {
EventBus.$on('send-message', msg => {
this.message = msg
})
}
}
</script>这里在组件 B 中监听事件总线,使用 EventBus.$on 方法接收组件 A 发送的消息。
四、跨级组件的通信
在跨级组件的通信中,我们可以使用 Vue 中提供的 provide/inject 方法实现。provide/inject 方法可以将数据传递给任意级别的后代组件。
provide 方法会向后代组件提供一个数据对象,inject 方法将这个数据对象注入到后代组件中。
父级组件代码:
<template>
<div>
<child-component></child-component>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
components: {
ChildComponent
},
provide() {
return {
message: 'Hello World!'
}
}
}
</script>这里在父级组件中使用 provide 方法向内部提供一个数据对象 message。
子级组件代码:
<template>
<div>{{ value }}</div>
</template>
<script>
export default {
inject: ['message'],
computed: {
value() {
return this.message
}
}
}
</script>这里在子级组件中使用 inject 方法注入父级组件提供的数据对象,然后使用这个数据对象。
总结
