当前位置:实例文章 » HTML/CSS实例» [文章]【Vue】day04-组件通信

【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` 组件,它有一个点击事件。

其他信息

其他资源

Top