【Vue】day04-组件通信
发布人:shili8
发布时间:2025-02-28 22:51
阅读次数:0
**Vue 组件通信**
在 Vue 中,组件之间可以通过各种方式进行通信。这种通信是指一个组件向另一个组件传递数据或事件,这样就可以实现组件之间的协作和交互。
###1. **props**
最简单也是最常用的方法就是使用 `props` 来传递数据。`props` 是父组件向子组件传递数据的一种方式。
**例子:**
html<!-- 父组件 -->
<template>
<div>
<child :name="name" @click="handleClick"></child>
</div>
</template>
<script>
import Child from './Child.vue'
export default {
components: { Child },
data() {
return {
name: 'Vue'
}
},
methods: {
handleClick() {
console.log('点击了')
}
}
}
</script>
html<!-- 子组件 -->
<template>
<div>
{{ name }}
<button @click="handleClick">点击我</button>
</div>
</template>
<script>
export default {
props: ['name'],
methods: {
handleClick() {
this.$emit('click')
}
}
}
</script>
在上面的例子中,我们定义了一个 `Child` 组件,它接受一个 `name` 的 `props`,并且有一个点击事件。父组件向子组件传递了 `name` 的值,并且监听了子组件的点击事件。
###2. **$emit**
除了使用 `props` 之外,我们还可以通过 `$emit` 来触发子组件的事件。
**例子:**
html<!-- 父组件 -->
<template>
<div>
<child @click="handleClick"></child>
</div>
</template>
<script>
import Child from './Child.vue'
export default {
components: { Child },
methods: {
handleClick() {
console.log('点击了')
}
}
}
</script>
html<!-- 子组件 -->
<template>
<div>
<button @click="handleClick">点击我</button>
</div>
</template>
<script>
export default {
methods: {
handleClick() {
this.$emit('click')
}
}
}
</script>
在上面的例子中,我们定义了一个 `Child` 组件,它有一个点击事件。父组件监听了子组件的点击事件。
###3. **$on**
除了使用 `$emit` 之外,我们还可以通过 `$on` 来监听子组件的事件。
**例子:**
html<!-- 父组件 -->
<template>
<div>
<child @click="handleClick"></child>
</div>
</template>
<script>
import Child from './Child.vue'
export default {
components: { Child },
methods: {
handleClick() {
console.log('点击了')
}
}
}
</script>
html<!-- 子组件 -->
<template>
<div>
<button @click="handleClick">点击我</button>
</div>
</template>
<script>
export default {
methods: {
handleClick() {
this.$emit('click')
}
},
mounted() {
this.$on('click', () => {
console.log('监听到了')
})
}
}
</script>
在上面的例子中,我们定义了一个 `Child` 组件,它有一个点击事件。父组件监听了子组件的点击事件。
###4. **$parent**
除了使用 `$emit` 和 `$on` 之外,我们还可以通过 `$parent` 来访问父组件。
**例子:**
html<!-- 父组件 -->
<template>
<div>
<child @click="handleClick"></child>
</div>
</template>
<script>
import Child from './Child.vue'
export default {
components: { Child },
methods: {
handleClick() {
console.log('点击了')
}
}
}
</script>
html<!-- 子组件 -->
<template>
<div>
<button @click="handleClick">点击我</button>
</div>
</template>
<script>
export default {
methods: {
handleClick() {
this.$parent.handleClick()
}
}
}
</script>
在上面的例子中,我们定义了一个 `Child` 组件,它有一个点击事件。父组件监听了子组件的点击事件。
###5. **$root**
除了使用 `$emit` 和 `$on` 之外,我们还可以通过 `$root` 来访问根组件。
**例子:**
html<!-- 父组件 -->
<template>
<div>
<child @click="handleClick"></child>
</div>
</template>
<script>
import Child from './Child.vue'
export default {
components: { Child },
methods: {
handleClick() {
console.log('点击了')
}
}
}
</script>
html<!-- 子组件 -->
<template>
<div>
<button @click="handleClick">点击我</button>
</div>
</template>
<script>
export default {
methods: {
handleClick() {
this.$root.handleClick()
}
}
}
</script>
在上面的例子中,我们定义了一个 `Child` 组件,它有一个点击事件。父组件监听了子组件的点击事件。
###6. **provide 和 inject**
除了使用 `$emit` 和 `$on` 之外,我们还可以通过 `provide` 和 `inject` 来传递数据和事件。
**例子:**
html<!-- 父组件 -->
<template>
<div>
<child :name="name" @click="handleClick"></child>
</div>
</template>
<script>
import Child from './Child.vue'
export default {
components: { Child },
data() {
return {
name: 'Vue'
}
},
methods: {
handleClick() {
console.log('点击了')
}
}
}
</script>
html<!-- 子组件 -->
<template>
<div>
{{ name }}
<button @click="handleClick">点击我</button>
</div>
</template>
<script>
export default {
inject: ['name'],
methods: {
handleClick() {
console.log('点击了')
}
}
}
</script>
在上面的例子中,我们定义了一个 `Child` 组件,它接受一个 `name` 的 `inject`,并且有一个点击事件。父组件向子组件传递了 `name` 的值,并且监听了子组件的点击事件。
###7. **Vuex**
除了使用 `$emit` 和 `$on` 之外,我们还可以通过 Vuex 来管理全局状态和事件。
**例子:**
html<!-- 父组件 -->
<template>
<div>
<child :name="name" @click="handleClick"></child>
</div>
</template>
<script>
import Child from './Child.vue'
import { mapState, mapMutations } from 'vuex'
export default {
components: { Child },
computed: {
...mapState(['name'])
},
methods: {
handleClick() {
console.log('点击了')
}
}
}
</script>
html<!-- 子组件 -->
<template>
<div>
{{ name }}
<button @click="handleClick">点击我</button>
</div>
</template>
<script>
import { mapState, mapMutations } from 'vuex'
export default {
computed: {
...mapState(['name'])
},
methods: {
handleClick() {
console.log('点击了')
}
}
}
</script>
在上面的例子中,我们定义了一个 `Child` 组件,它接受一个 `name` 的 `mapState`,并且有一个点击事件。父组件向子组件传递了 `name` 的值,并且监听了子组件的点击事件。
###8. **EventBus**
除了使用 `$emit` 和 `$on` 之外,我们还可以通过 EventBus 来管理全局事件。
**例子:**
html<!-- 父组件 -->
<template>
<div>
<child @click="handleClick"></child>
</div>
</template>
<script>
import Child from './Child.vue'
import EventBus from 'event-bus'
export default {
components: { Child },
methods: {
handleClick() {
console.log('点击了')
}
}
}
</script>
html<!-- 子组件 -->
<template>
<div>
<button @click="handleClick">点击我</button>
</div>
</template>
<script>
import EventBus from 'event-bus'
export default {
methods: {
handleClick() {
EventBus.$emit('click')
}
}
}
</script>
在上面的例子中,我们定义了一个 `Child` 组件,它有一个点击事件。

