Skip to content

Vue3组件通信方式

在Vue3中,组件之间的通信方式有多种,以下是常见的几种:

1. Props和Emit

最基础的父子组件通信方式:

vue
<!-- 父组件 -->
<template>
  <child-component :message="msg" @update="handleUpdate" />
</template>

<!-- 子组件 -->
<template>
  <div @click="emit('update', 'new value')">
    {{ message }}
  </div>
</template>

2. Provide/Inject

适用于深层组件嵌套的场景:

ts
// 父组件
const message = ref('Hello')
provide('message', message)

// 子组件
const message = inject('message')

3. Vuex/Pinia

全局状态管理:

ts
// Pinia store
export const useUserStore = defineStore('user', {
  state: () => ({
    name: ''
  }),
  actions: {
    updateName(name: string) {
      this.name = name
    }
  }
})

4. EventBus

使用mitt实现的事件总线:

ts
import mitt from 'mitt'

const emitter = mitt()

// 组件A发送事件
emitter.emit('update', { data: 'new value' })

// 组件B监听事件
emitter.on('update', (data) => {
  console.log(data)
})

5. v-model

双向绑定:

vue
<!-- 父组件 -->
<template>
  <custom-input v-model="searchText" />
</template>

<!-- 子组件 CustomInput.vue -->
<template>
  <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" />
</template>

TIP

选择合适的通信方式要考虑组件之间的关系和数据流向。一般来说:

  • 父子组件用props/emit
  • 跨层级组件用provide/inject
  • 全局状态用Pinia
  • 独立组件间通信用EventBus