当前位置: 首页 > news >正文

Vue 组件通信方式总览

Vue 中,组件通信有很多种方式,适合不同的场景。
我给你系统地总结一版,方法 + 场景 + 简单例子,非常清晰直白!👇


📦 Vue 组件通信方式总览

通信方式适合场景简单描述
props + emit父子组件传值父传数据给子,子触发事件通知父
v-model父子双向绑定父和子同步更新数据
provide / inject祖孙组件传值父(祖先)提供数据,任意后代组件注入
eventBus(小项目)跨级、兄弟通信通过一个中央事件总线来发消息监听
Pinia(或 Vuex)大项目全局共享状态管理工具,统一管理数据
ref + defineExpose父拿到子的方法或数据父通过 ref 直接操作子组件
slots 插槽传模板内容父把结构/内容传给子

🔥 主要的用法举例


1. props + emit(父子通信)

父传子:props

<Child :msg="parentMsg" />

子组件

<script setup>
defineProps(['msg'])
</script>

子传父:emit

<Child @submit="handleSubmit" />

子组件

<script setup>
const emit = defineEmits(['submit'])function submit() {emit('submit', '子组件传给父的数据')
}
</script>

2. v-model(父子双向绑定)

父子组件同步一份数据!

父组件

<Child v-model="username" />

子组件

<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])function updateValue(e) {emit('update:modelValue', e.target.value)
}
</script>

3. provide / inject(祖孙通信)

祖先组件提供

<script setup>
import { provide } from 'vue'
provide('userInfo', { name: 'Tom', age: 20 })
</script>

任意子孙组件注入

<script setup>
import { inject } from 'vue'
const user = inject('userInfo')
console.log(user)
</script>

4. eventBus(适合兄弟通信,小项目用)

手动创建一个简单的事件中心:

// eventBus.js
import mitt from 'mitt'
export const eventBus = mitt()

发送事件

import { eventBus } from './eventBus'
eventBus.emit('eventName', payload)

监听事件

import { eventBus } from './eventBus'
eventBus.on('eventName', (payload) => {console.log(payload)
})

5. Pinia 状态管理(大型项目推荐)

统一管理全局数据。

import { defineStore } from 'pinia'export const useUserStore = defineStore('user', {state: () => ({username: 'Tom'}),actions: {updateName(newName) {this.username = newName}}
})

然后各个组件都可以直接使用。


6. ref + defineExpose(父拿子组件方法或数据)

子组件

<script setup>
import { ref } from 'vue'
const count = ref(0)function add() {count.value++
}defineExpose({ count, add })
</script>

父组件

<template><Child ref="childRef" /><button @click="childRef.add()">增加</button>
</template><script setup>
import { ref } from 'vue'
import Child from './Child.vue'const childRef = ref()
</script>

🎯 总结

通信场景推荐方法
父子props + emit
父子双向绑定v-model
祖孙provide / inject
兄弟eventBus
跨越整个项目Pinia
父直接操控子ref + defineExpose
内容传递slot

🚀 一句话记住

小项目:props/emit/eventBus,大项目:Pinia,全局管理;祖孙:provide/inject;复杂逻辑:ref + expose。

相关文章:

  • 智能指针之设计模式6
  • 1.6二重积分
  • Python中的单例模式:深入探索元类与装饰器实现
  • 安卓基础(HashMap和ArrayList)
  • 注意力机制:从 MHA、MQA、GQA、MLA 到 NSA、MoBA
  • 东莞SMT贴片加工工艺优化解析
  • 代码随想录算法训练营 Day34 动态规划Ⅱ 路径
  • 魔三与指北者新品发布会在茅台镇圆满举办,开启音乐设备新篇章
  • 北京市延庆区“禅苑茶事“非遗项目挂牌及茶事院正式启用
  • 孙宇晨将出席迪拜Token2049 与特朗普次子共话加密未来
  • 使用腾讯地图检索地点
  • .NET8配置组件
  • 锁和事务谁在外层
  • c++进阶——多态
  • word文档插入公式后行距变大怎么办?
  • 一文了解无人机系统
  • Ubuntu18.04安装IntelliJ IDEA2025步骤
  • 互容是什么意思?
  • 数据访问模式详解:在线访问、DAO、DTO、离线存储与ORM
  • 碳基芯片:半导体技术的下一个突破点?
  • 深入贯彻中央八项规定精神学习教育中央指导组派驻地方和单位名单公布
  • 工信部:加快自动驾驶系统安全要求强制性国家标准研制
  • 【社论】优化限购限行,激发汽车消费潜能
  • 脱发后怎么把头发养回来?脱发自救指南来了
  • 李公明|一周画记:哈佛打响第一枪
  • 传智教育连续3个交易日跌停:去年净利润由盈转亏