当前位置:首页 > 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 倒计时组件实现 核心思路 通过 setInterval 或 setTimeout 实现时间递减,结合 Vue 的响应式数据更新 UI。需注意组件销毁时清除定时器。 基础实现方案 模板部分…

vue实现穿梭框树组件

vue实现穿梭框树组件

Vue 穿梭框树组件实现 穿梭框树组件通常结合了树形结构和穿梭框功能,允许用户在左右两栏之间移动树节点数据。以下是基于 Vue 的实现方案: 核心功能设计 数据结构 树形数据通常采用嵌套结构,例如:…

uniapp组件写法

uniapp组件写法

Uniapp 组件的基本写法 Uniapp 的组件写法与 Vue 类似,支持单文件组件(.vue 文件)。一个基本的组件通常包含三个部分:<template>、<script>…

vue实现水印组件

vue实现水印组件

Vue 水印组件的实现方法 使用Canvas绘制水印 在Vue组件中通过Canvas动态生成水印图案,将其作为背景添加到目标元素上。 <template> <div ref="…

如何判断react组件

如何判断react组件

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

h5实现通信

h5实现通信

H5实现通信的方法 H5(HTML5)提供了多种通信方式,适用于不同场景的需求。以下是常见的几种实现方法: WebSocket通信 WebSocket是一种全双工通信协议,适用于实时性要求高的场景。…