惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

TaoSecurity Blog
TaoSecurity Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
Cisco Talos Blog
Cisco Talos Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Secure Thoughts
美团技术团队
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
月光博客
月光博客
T
Tor Project blog
P
Privacy & Cybersecurity Law Blog
Recorded Future
Recorded Future
I
Intezer
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
GbyAI
GbyAI
罗磊的独立博客
V
V2EX
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
A
About on SuperTechFans
Scott Helme
Scott Helme
Vercel News
Vercel News
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
Recent Announcements
Recent Announcements
Hacker News: Ask HN
Hacker News: Ask HN
C
CERT Recently Published Vulnerability Notes
G
Google Developers Blog
B
Blog
博客园 - 叶小钗
WordPress大学
WordPress大学
博客园 - 聂微东
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Jina AI
Jina AI
IT之家
IT之家
C
Cybersecurity and Infrastructure Security Agency CISA
P
Palo Alto Networks Blog
小众软件
小众软件
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
AWS News Blog
AWS News Blog

博客园 - 一名程序媛呀

Anki插件开发必知必会:钩子函数与右键菜单定制 httpx 传参总报错?这次把 GET、POST、文件上传到响应处理的坑给你一次填平 从卡顿到丝滑:FastAPI 调用外部 API 的正确姿势(httpx 实战) 还在 XHR、Fetch 和 Axios 之间纠结?我踩过的坑,希望你一个都不用碰到 你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南 Uvicorn、Gunicorn 傻傻分不清?FastAPI 生产部署避坑指南 Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招! 刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API 别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了 掏出手机就能搭个 WebDAV 同步服务器?这操作有点香 别只盯着GitBook了!这个文档神器让你的笔记秒变网站 写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩明白了 FastAPI 身份验证总踩坑?这份 FastAPI Users “避坑指南”请收好 旧手机别扔!用 Termux 搭个私人云盘,比网盘香多了 你的FastAPI又在服务器上“跑不起来”了?来,今天咱把打包这件事彻底聊透 写页面时别再把 Element Plus 整个搬进来啦!Vue3按需加载的坑我帮你踩平了 前端包管理咋选?我从npm叛逃到pnpm的血泪史(附避坑指南) 聊聊 fetch 使用中我踩过的那些坑和正确打开方式 FastApiAdmin 后端接口开发好了,前端管理界面怎么调用与显示? 给 FastApiAdmin 加个“会议纪要”模块,我把后端二次开发的坑踩了个遍 我用了FastApiAdmin后,连夜把踩过的坑都整理出来了 告别 Typora 后的新欢:我把所有笔记迁移到了 Obsidian 这个“第二大脑” 你的Agent API还在裸奔?从认证到沙箱,我用FastAPI搭了几道防线 让 FastAPI Agent 思考不阻塞:手把手教你实现异步任务与后台处理方案 让FastAPI Agent真正记住你:聊聊会话记忆与持久化存储的落地实践 FastAPI Agent 函数调用实战:我让 AI 学会了“自己动手查天气“ 初探:用 FastAPI 搭建你的第一个 AI Agent 接口 FastAPI 少有人提的实用技巧:把 Depends 依赖提到路由层,代码少写60% FastAPI 生产环境静态文件完全指南:从 /favicon.ico 404 到 HSTS 混合内容,一次全根治 用了loguru我才明白,Python日志还能这么写 FastAPI 后台任务:BackgroundTasks 的使用场景与注意事项 FastAPI配置管理避坑指南:从硬编码到 .env 与 pydantic_settings 类,连路由用法都给你捋清楚 FastAPI 文件上传避坑全指南:分块存盘、类型校验与安全兜底 FastAPI + Pydantic 模型终极实战手册:从能跑就行到固若金汤,这些技巧你一定用得上 FastAPI + SQLAlchemy 2.0 通用CRUD操作手册 —— 从同步到异步,一次讲透 FastAPI订单防超卖实战:从数据库锁到Saga分布式事务,这一篇给你理清了 FastAPI 生产环境避坑指南:用 Alembic 管理数据库迁移,别再手动改表结构了! FastAPI服务半夜又挂了?先别急着重启,查查你的数据库连接池“池子”是不是漏了 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 Vue 3 组合式 API 香是香,但从Vue2迁移时你可别像我当初一样踩进这 3 个深坑里 我用fastapi-scaff搭了个项目,两天工期缩到两小时,老板以为我开挂了 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! FastAPI自动生成的API文档太丑?我花了一晚上把它改成了客户愿意付费的样子 告别手写 API 胶水代码:FastAPI 与 Vue 的“契约自动机” OpenAPI 实战 FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南” FastAPI + Celery 实战:异步任务里调用 Redis 和数据库的全解析,及生产级组织方案 FastAPI里玩转Redis和数据库的正确姿势,别让异步任务把你坑哭了! FastAPI + Celery 实战:异步任务的坑与解法,我帮你踩了一遍 FastAPI子应用挂载:别再让root_path坑你一夜 FastAPI项目半夜报警吵醒你?聊聊告警这事儿怎么搞! 别再数据线了!用FastAPI 5分钟搭个局域网文件+剪贴板神器 FastAPI单元测试实战:别等上线被喷才后悔,TestClient用对了真香! FastAPI状态共享秘籍:别再让中间件、依赖和路由“各自为政”了! FastAPI实战:WebSocket vs Socket.IO,这回真给我整明白了! 从0到1,FastAPI + PostgreSQL + Tortoise ORM 实战避坑指南 FastAPI + PostgreSQL 实战:给应用装上“缓存”和“日志”翅膀 FastAPI + PostgreSQL 实战:从入门到不踩坑,一次讲透
Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看
一名程序媛呀 · 2026-04-16 · via 博客园 - 一名程序媛呀

是不是每次遇到跨层级组件传值,就感觉代码像一团乱麻?明明用的是Vue 3,却还在用Vue 2的思维写一堆层层转发的 propsemits

之前重构一个后台管理项目,一个表单深埋在三级路由下,要把数据传给顶栏的用户头像更新状态。看着那个 defineEmits 链条像击鼓传花一样传了三四层,我直接给自己整笑了。🎯 这玩意儿维护起来,简直是噩梦。

今天咱不聊那些虚无缥缈的源码解析,就踏踏实实地、像唠嗑一样,把这五种 Vue 3 组件通信方式捋一遍。

我的目标只有一个:让你看完之后,能根据不同的场景,像掏工具包一样,“唰”地拿出最趁手的那把螺丝刀。


🎯 核心摘要:这篇文章能帮你省下多少头发?

这不仅仅是一份API清单。我会把这五种通信方式比作家里的水管系统,你马上就能明白什么时候该用直通管,什么时候该打个“眼儿”直连楼下。

更重要的是,我会把我踩过的坑——比如用 mitt 忘了解绑导致页面崩了的血泪史——都给你标出来。

📋 主要内容脉络(看一眼就知道该往哪看)

👉 父子直连: PropsEmits (最基础,别嫌烦)

👉 隔代传功: provide/inject (跨级神器,但有坑)

👉 双向奔赴: v-model (Vue 3 的语法糖真香警告)

👉 江湖救急: mitt (毫无关系的组件怎么勾搭?用它!)

第一部分:咱们先捋捋,为什么通信这么让人头疼?

Vue 的设计哲学是“单向数据流”,这就像瀑布,水只能从上往下流。但写业务不是搞艺术,你总会遇到需要把下游的垃圾(数据)扔到上游去,或者两个完全不挨着的组件要共享状态。

很多新手(包括当年的我)的做法是:疯狂提升状态到父组件,然后通过 props 一层层往下灌。这在小型项目里没毛病,但在大型应用里,这种“Props 钻井”会让你崩溃。

第二部分:核心原理,当成水管工来理解

1. Props 与 Emits —— 你家卫生间的进水管和下水道

这是父子组件的标准对话方式。Props 是爹给儿子的钱(只读,别想篡改),Emits 是儿子喊爹帮忙办事(触发事件)。

// 父组件
<ChildComponent :name="userName" @update="handleUpdate" />

// 子组件
const props = defineProps(['name'])
const emit = defineEmits(['update'])
emit('update', newValue)

⚠️ 我踩过的坑:千万别在子组件里直接修改引用类型的 props (比如 props.obj.name = 'new' )。虽然对象引用不会报错,但这会让数据流乱成一锅粥,调试的时候哭都找不到调。

2. provide/inject —— 楼板打了个洞,直通楼下

你可能会问:“那我五层楼的组件怎么给一层传数据?” 好,咱们先来聊聊这个。

provide 就是顶层组件挖个洞,无论下面多少层子孙,只要通过 inject 伸个管子就能接到水。

再说个容易翻车的点:默认情况下,provide 的数据不是响应式的
如果你传了个普通数字,后面变了,楼下接到的还是旧的。要传 ref 或者 reactive 才行,或者用 Vue 3 提供的 computed 包一层。

3. v-model —— 双向对讲机,不是单向广播了

Vue 3 的 v-model 太好用了!它就是 :modelValue@update:modelValue 的语法糖。重点是现在可以绑定多个 v-model:title ,封装弹窗组件的时候香疯了。

4. mitt —— 那个满大街喊话的大喇叭

对于完全没有关系的组件(比如两个平级的菜单组件要联动),Vue 3 移除了全局事件总线,官方推荐用 mitt 这种第三方微型库。它就像个传呼台,A组件广播“喂喂喂我是XXX”,B组件随时待命收到。

❗️这里千万别学我当初偷懒,否则……否则项目上线后会发现内存泄漏,页面越用越卡。
mitt 最最最重要的一步:在组件销毁时(onBeforeUnmount)一定要 off 掉你监听的频道!

第三部分:实战,来段能跑的代码压压惊

接下来重点来了,看看 mitt 怎么用,别写错了:
这里把发送代码放到了 onMounted 里,防止小伙伴做测试时,触发不了发送事件,还在纳闷怎么接收不到数据!!!

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

// 组件A (发送)
import { emitter } from '@/utils/eventBus'
import { onMounted } from "vue";
onMounted(() => {
  emitter.emit('send-message', { msg: 'Hello World' })
})

// 组件B (接收)
import { emitter } from '@/utils/eventBus'
import { onBeforeUnmount } from 'vue'

const handler = (data) => { console.log(data) }
emitter.on('send-message', handler)

// 必做!必做!必做!
onBeforeUnmount(() => {
  emitter.off('send-message', handler)
})

补充一个 provide / inject 的代码示例,毕竟这个用的也不少,核心代码很简单

// 父组件打洞放数据
import { provide, ref } from "vue";
const theme = ref('Dark')
provide('Theme', theme) // 向外放数据

// 子组件接数据
import { inject } from "vue";
const theme = inject('Theme', 'Light') // 获取数据,可定义默认值

第四部分:最后啰嗦一句,怎么选?

是不是以为这样就完了?还没呢,光知道原理不够,得知道什么时候拔哪把刀。

- 父子组件、简单数据流: 老老实实 Props / Emits 。代码可读性第一。

- 深层嵌套(表单上下文、主题色): 首选 provide / inject 。别再用 props 穿针引线了。

- 组件封装(Input、Dialog): 无脑 v-model 。Vue 3 的语法糖真的甜。

- 跨视图、跨路由、无关组件: 如果项目小,用 mitt 足够了;如果项目大,直接上 Pinia,别拿 mitt 当全局状态仓库使,那是拿擀面杖当金箍棒,不趁手。


好啦,今天的组件通信“避坑指南”就聊到这。技术这玩意儿就是这样,原理说破了不值钱,但那个自己亲手把页面搞崩掉的坑,才是最宝贵的经验。

这篇东西花了好多心血整理的,如果你觉得有用,或者觉得以后大概率会用到,千万别让它就这么在收藏夹里吃灰。点赞+关注,转给那个还在用 Props 一层层嵌套的冤种同事,说不定今晚他能请你喝杯奶茶呢?☺️

老样子,有什么问题和想法,留言区里,咱们不见不散~ 👋