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

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。

http://www.xdnf.cn/news/2543.html

相关文章:

  • OpenCV 图形API(70)图像与通道拼接函数-----创建一个图像或矩阵(GMat)的副本的操作函数copy()
  • Maven多模块工程版本管理:flatten-maven-plugin扁平化POM
  • 打火机检测数据集VOC+YOLO格式925张1类别
  • 使用POI和EasyExcel使用导入
  • 实战指南:搭建AIRIOT全场景智慧养老管理平台系统全流程解析
  • 2025系统架构师---基于规则的系统架构风格‌
  • 【硬件系统架构】哈佛架构
  • Linux 内核网络协议栈中的关键数据结构:inet_skb_parm 与 ip_options
  • 媒体查询使用
  • 《Go 语言高并发爬虫开发:淘宝商品 API 实时采集与 ETL 数据处理管道》
  • 无刷空心杯电机及机器人灵巧手的技术解析与发展趋势
  • 关系型数据库的SQL语句
  • Paramiko 完全指南
  • 2. 第一个网页:前端基础入门
  • MySQL 表的约束(二)
  • 数据结构*栈
  • 微信小程序连续多个特殊字符自动换行解决方法
  • DSP48E2 的 MAC模式功能仿真
  • C#与SVN的深度集成:实现版本控制自动化管理​
  • 【星海出品】K8S调度器leader
  • 如何验证二叉搜索树(BST):Java实现详解
  • C++ 可调用实体 (详解 一站式)
  • 我的HTTP和HTTPS
  • Mariadb 防火墙服务器和端口:mysql | 3306
  • 如何实现Kafka的Exactly-Once语义?
  • 关于kafka
  • 突破JVM边界:类加载三重门与栈帧的生存法则
  • 如何搭建spark yarn 模式的集群集群。
  • 如何在idea中写spark程序
  • Excel处理控件Aspose.Cells for Go :通过 C++ 实现的设计概念和 API 架构讲解