Vue3组件通信全攻略:8种传值方式详解

embedded/2025/2/13 19:45:56/

前言

在Vue3开发中,组件通信是构建复杂应用的核心技能。本文将全面讲解Vue3支持的8种组件传值方式,助你轻松应对各种场景!


一、Props父传子

适用场景:父组件向直接子组件传递数据

<!-- 父组件 -->
<template><Child :title="parentTitle" />
</template><script setup>
import Child from './Child.vue'
const parentTitle = "来自父组件的消息"
</script><!-- 子组件Child.vue -->
<template><h2>{{ title }}</h2>
</template><script setup>
// Options API写法
// export default {
//   props: ['title']
// }// Composition API写法
const props = defineProps({title: {type: String,default: '默认标题'}
})
</script>

二、自定义事件子传父

适用场景:子组件向父组件传递数据

<!-- 子组件 -->
<template><button @click="sendMessage">发送消息</button>
</template><script setup>
const emit = defineEmits(['message-sent'])const sendMessage = () => {emit('message-sent', '子组件的数据')
}
</script><!-- 父组件 -->
<template><Child @message-sent="handleMessage" />
</template><script setup>
const handleMessage = (msg) => {console.log(msg) // 输出:子组件的数据
}
</script>

三、v-model双向绑定

Vue3新特性:支持多个v-model绑定

<!-- 父组件 -->
<template><Child v-model:title="pageTitle" v-model:content="pageContent" />
</template><!-- 子组件 -->
<template><input :value="title"@input="$emit('update:title', $event.target.value)"><textarea:value="content"@input="$emit('update:content', $event.target.value)">
</template><script setup>
defineProps(['title', 'content'])
defineEmits(['update:title', 'update:content'])
</script>

四、Ref获取组件实例

适用场景:父组件直接调用子组件方法

<!-- 父组件 -->
<template><Child ref="childRef" /><button @click="callChildMethod">调用子组件</button>
</template><script setup>
import { ref } from 'vue'
const childRef = ref(null)const callChildMethod = () => {childRef.value.childMethod()
}
</script><!-- 子组件 -->
<script setup>
const childMethod = () => {console.log('子组件方法被调用')
}// 需暴露方法给父组件
defineExpose({childMethod
})
</script>

五、Provide/Inject依赖注入

适用场景:跨层级组件通信

<!-- 祖先组件 -->
<script setup>
import { provide } from 'vue'provide('globalColor', 'red')
</script><!-- 任意后代组件 -->
<script setup>
import { inject } from 'vue'const color = inject('globalColor', 'blue') // 默认值blue
</script>

六、事件总线(Event Bus)

Vue3实现方式:需借助第三方库(推荐mitt)

javascript">// eventBus.js
import mitt from 'mitt'
export const emitter = mitt()// 组件A发送事件
emitter.emit('custom-event', data)// 组件B监听事件
emitter.on('custom-event', (data) => {// 处理数据
})

七、Pinia状态管理

推荐方案:Vue官方新一代状态管理工具

javascript">// store/counter.js
export const useCounterStore = defineStore('counter', {state: () => ({ count: 0 }),actions: {increment() {this.count++}}
})// 组件中使用
import { useCounterStore } from './store/counter'
const counter = useCounterStore()
console.log(counter.count) // 0
counter.increment()

八、LocalStorage/SessionStorage

适用场景:持久化数据存储

javascript">// 存储
localStorage.setItem('user', JSON.stringify(userData))// 读取
const user = JSON.parse(localStorage.getItem('user'))

方法对比

方式适用场景数据流向复杂度
Props父子组件父→子★☆☆
自定义事件父子组件子→父★☆☆
v-model父子双向绑定双向★★☆
Provide/Inject跨层级组件祖先→后代★★☆
Pinia复杂应用/多组件共享状态任意方向★★★
事件总线任意组件(简单场景)任意方向★★☆

最佳实践建议

  1. 优先使用Props/Events处理直接父子通信
  2. 深层嵌套组件使用Provide/Inject
  3. 复杂应用建议采用Pinia状态管理
  4. 慎用事件总线,避免难以维护的事件链
  5. 表单场景优先考虑v-model双向绑定

扩展思考:如何选择通信方式?

  • 根据组件层级关系
  • 考虑数据流动频率
  • 评估应用复杂度
  • 关注数据持久化需求

希望这篇指南能帮助你在Vue3开发中游刃有余地处理组件通信!如果有任何疑问,欢迎在评论区留言讨论!


下一篇预告:《Vue3 Composition API深度解析》欢迎关注!



http://www.ppmy.cn/embedded/161952.html

相关文章

自动化遇到的问题记录(遇到问题就更)

总结回归下自己这边遇到的一些问题 “EOF错误”&#xff0c;获取不到csv里面的内容 跑多csv文件里的场景&#xff0c;部分场景的请求值为 1、检查csv文件里不能直接是[]开头的参数&#xff0c;把[]改到ms平台的请求参数里 2、有时可能是某个参数值缺了双引号的其中一边 met…

Python基于Django的微博热搜、微博舆论可视化系统(V3.0)【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

驱动开发、移植(最后的说法有误,以后会修正)

一、任务明确&#xff1a;把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作&#xff0c; sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…

centos 和 ubuntu 区别

一、发行版与支持 1. CentOS 是基于 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码重新编译而成的社区版&#xff0c;遵循开源协议。一般由社区进行维护&#xff0c;每 7 年左右发布一个主要版本&#xff0c;注重稳定性和长期支持&#xff0c;适合对系统稳定性…

使用瑞芯微RK3588的NPU进行模型转换和推理

使用边缘设备进行算法落地时&#xff0c;通常要考虑模型推理速度&#xff0c;NVIDA系列平台可以使用TensorRT和CUDA加速&#xff0c;瑞芯微RK3588的板子上都是Arm的手机GPU&#xff0c;虽然没有类似CUDA的加速计算方式&#xff0c;但是提供了NPU进行加速推理&#xff0c;本文说…

MySQL8.0 innodb Cluster 高可用集群部署(MySQL、MySQL Shell、MySQL Router安装)

简介 MySQL InnoDB集群&#xff08;Cluster&#xff09;提供了一个集成的&#xff0c;本地的&#xff0c;HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议&#xff0c;保障数据一致性&#xff0c;组复制支持单主模式和多主模式。 InnoDB Cluster组件&#xff1a; …

2022年中职网络建设与运维赛题-windows服务器解析

windows和linux安装后都需要关闭防火墙 一、windows服务配置 注意事项 1.首先要改一下主机名&#xff0c;.在控制面板或者在设置中更改&#xff0c;然后关闭防火墙&#xff0c;配置题中的静态ip地址 2.加入域之后换回工作组&#xff0c;然后又重新加入域&#xff0c;需要在域…

JavaScript设计模式 -- 单例模式

在实际开发中&#xff0c;我们常常需要确保某个类只有一个实例&#xff0c;并提供全局访问点。**单例模式&#xff08;Singleton Pattern&#xff09;**正是为了解决这个问题而产生的。本文将详细介绍单例模式的原理、实现方式以及在 JavaScript 中的多种应用场景&#xff0c;通…