刚开始学 Vue 的时候,觉得这框架啥都好,就是组件拆多了以后,数据传过来传过去太让人抓狂。父传子、子传父还能搞得清,碰到嵌套了三四层的组件要互通有无,直接就蒙圈了。
后来写业务写多了才发现,Vue 组件之间通信来来回回也就那么几种套路。我把平时写代码最常用的 6 种方式整理了出来,用熟了基本上就没有你传不到的数据。
1. 最稳妥的父子传话:Props / $emit
这是最基础、最不容易出 Bug 的方式,就像你给你儿子发生活费,他给你汇报成绩。
父亲传给儿子 (Props):
1 | <!-- 父组件里 --> |
1 | // 子组件里接收 |
儿子报告给父亲 ($emit):
1 | // 子组件里遇到点啥事,大喊一声 |
1 | <!-- 父组件里在旁边听着 --> |
2. 父亲直接对儿子发号施令:$refs
如果你懒得搞各种事件绑定,想直接粗暴地调用子组件里的方法,用 $refs 最爽。
1 | <template> |
3. 兄弟间传纸条:EventBus 事件总线
这招适合小型项目里,两个完全不搭噶的兄弟组件想要通信。建一个专门管收发信件的“邮局”。
先搞个空的 Vue 实例当邮局:
1 | // event-bus.js |
1 | // 兄弟 A 发电报: |
1 | // 兄弟 B 收电报: |
4. 终极一波流大管家:Vuex
一旦项目大了,EventBus 满天飞,你根本找不到谁发了什么事件。这时候就得上 Vuex(或者现在的 Pinia)了,大家把要共享的钱全放在一个银行里,谁要用谁去取。
1 | // store/index.js (存钱) |
1 | <!-- 组件里直接用 (取钱) --> |
5. 祖宗传家宝:provide / inject
这招在写公共组件或者组件库的时候特别管用!假设你有一个太爷爷组件,想直接传点东西给重孙子,如果一层一层写 props 那得累死。
1 | // 祖宗组件直接发话: |
1 | // 重孙子组件不管嵌套多深,直接认领: |
6. 原封不动地踢皮球:$attrs / $listeners
这个比较高级,通常用来二次封装组件。比如你想包装一个饿了么的 <el-input>,但是它身上有几十个属性和事件,你总不能在自己的组件里写几十个 props 去接吧?
1 | <!-- 我的组件 MyInput.vue --> |
基本上,掌握这 6 招,不管公司的 Vue 代码写得有多像俄罗斯套娃,你都能轻松把数据传得明明白白。
评论加载中…