当前位置:首页 > VUE

vue实现组件通信

2026-03-08 05:49:21VUE

父子组件通信

通过 props$emit 实现父子组件通信。父组件通过 props 向子组件传递数据,子组件通过 $emit 触发事件向父组件传递数据。

父组件传递数据:

<template>
  <ChildComponent :message="parentMessage" @update="handleUpdate" />
</template>

<script>
export default {
  data() {
    return {
      parentMessage: 'Hello from parent'
    }
  },
  methods: {
    handleUpdate(newMessage) {
      this.parentMessage = newMessage
    }
  }
}
</script>

子组件接收和发送数据:

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="sendMessage">Send to Parent</button>
  </div>
</template>

<script>
export default {
  props: ['message'],
  methods: {
    sendMessage() {
      this.$emit('update', 'New message from child')
    }
  }
}
</script>

兄弟组件通信

通过共同的父组件作为中介实现兄弟组件通信。一个子组件通过 $emit 向父组件发送数据,父组件再通过 props 传递给另一个子组件。

父组件:

<template>
  <ChildA @message-sent="handleMessage" />
  <ChildB :message="sharedMessage" />
</template>

<script>
export default {
  data() {
    return {
      sharedMessage: ''
    }
  },
  methods: {
    handleMessage(message) {
      this.sharedMessage = message
    }
  }
}
</script>

跨层级组件通信

使用 provideinject 实现跨层级组件通信。祖先组件通过 provide 提供数据,后代组件通过 inject 注入数据。

祖先组件:

<script>
export default {
  provide() {
    return {
      sharedData: 'Data from ancestor'
    }
  }
}
</script>

后代组件:

<script>
export default {
  inject: ['sharedData'],
  mounted() {
    console.log(this.sharedData)
  }
}
</script>

全局事件总线

创建一个全局事件总线实现任意组件间通信。在 Vue 原型上添加一个事件总线实例,组件通过 $on$emit 进行通信。

创建事件总线:

vue实现组件通信

// eventBus.js
import Vue from 'vue'
export const EventBus = new Vue()

发送事件:

import { EventBus } from './eventBus.js'
EventBus.$emit('event-name', data)

接收事件:

import { EventBus } from './eventBus.js'
EventBus.$on('event-name', data => {
  console.log(data)
})

Vuex 状态管理

使用 Vuex 进行集中式状态管理,适用于大型应用中的组件通信。

定义 store:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    }
  },
  actions: {
    increment({ commit }) {
      commit('increment')
    }
  }
})

组件中使用:

vue实现组件通信

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
export default {
  computed: {
    count() {
      return this.$store.state.count
    }
  },
  methods: {
    increment() {
      this.$store.dispatch('increment')
    }
  }
}
</script>

使用 $attrs 和 $listeners

通过 $attrs$listeners 实现跨层级属性传递和事件监听。

父组件:

<template>
  <ChildComponent v-bind="$attrs" v-on="$listeners" />
</template>

中间组件不需要显式声明 props 和 events,自动传递到子组件。

使用 $refs

通过 $refs 直接访问子组件实例和方法。

父组件:

<template>
  <ChildComponent ref="child" />
  <button @click="callChildMethod">Call Child Method</button>
</template>

<script>
export default {
  methods: {
    callChildMethod() {
      this.$refs.child.childMethod()
    }
  }
}
</script>

子组件:

<script>
export default {
  methods: {
    childMethod() {
      console.log('Child method called')
    }
  }
}
</script>

标签: 组件通信
分享给朋友:

相关文章

vue怎么实现组件缓存

vue怎么实现组件缓存

vue实现组件缓存的方法 在Vue中实现组件缓存可以通过内置的<keep-alive>组件完成,该组件能够缓存不活动的组件实例,避免重复渲染。 使用<keep-alive>基…

react组件如何通讯

react组件如何通讯

React 组件通讯方式 React 组件间的通讯方式主要包括以下几种方法,适用于不同场景下的数据传递和状态管理需求。 父子组件通讯(Props 传递) 父组件通过 props 向子组件传递数据或回…

vue radio组件实现

vue radio组件实现

Vue Radio 组件实现 在 Vue 中实现 Radio 组件可以通过原生 HTML 的 <input type="radio"> 结合 Vue 的响应式特性来完成。以下是几种常见的实…

如何判断react组件

如何判断react组件

判断 React 组件的依据 React 组件的判断通常基于其定义方式、功能特性和代码结构。以下是几种常见的判断方法: 函数组件与类组件 函数组件是通过 JavaScript 函数定义的,接收 pr…

vue实现组件切换

vue实现组件切换

Vue 组件切换的实现方法 在 Vue 中实现组件切换有多种方式,以下是几种常见的方法: 动态组件 使用 Vue 内置的 <component> 元素和 is 属性可以动态切换组件:…

vue组件实现注册

vue组件实现注册

Vue 组件注册的两种方式 全局注册 通过 Vue.component() 方法注册,注册后可在任意 Vue 实例中使用。通常在项目的入口文件(如 main.js)中操作: import V…