初探 Vue 3.0 的组装式 API(四)
这次再说一说父子组件之间的传值与通信场景。
前文:
(四)组件通信与跨级传值
1. emit 与 slots
Vue3 中从父级向子级传值与 Vue2 一样,就是在模板里创建子组件的标签时,通过 v-bind:/: 指令传值。
而父组件通过 v-on:/@ 绑定的事件监听器,需要在子组件触发事件时,需要通过 props 之后的第二个参数 context 调用:
1 | // child.vue |
同时,context 中还提供了我们操作子组件时经常需要用到的插槽 slots:
1 | // parent.vue |
顺带一提,由于 context 不是响应式的,所以我们可以直接在参数表中,使用解构赋值取出 emit 和 slots:
1 | // parent.vue |
不过需要注意,slots 的属性值也可能随时发生变化,但它本身并非响应式数据。为了确保你的组件随时获得最新的插槽状态,建议在 onUpdated 中操作其属性值。
2. 跨级传值
我们有时会遇到类似这样的需求(比如:Tab 与 TabPane),所有子组件需要根据同一个父组件/祖先组件的状态调整自身的状态,做到跨级数据联动。
a) Vue2 方案
在 Vue2 中,是被打散在不同构造参数中的 provide 和 inject 属性实现的:
1 | // tab.vue |
可以看到,又是被打散到不同 data/methods/computed 段落的零散数据,靠 this 强行绑定到一起。
b) Vue3 方案
在 Vue3 中,则是通过 provide 和 inject 函数,更直观地组装出来:
1 | // tab.vue |
传入响应式数据后,在子孙组件都可以方便地取到,以至于甚至可以替代很多 Vuex 的使用场景。
这一系列至此告一段落,Vue3 的组装 API 使用起来还是相对简单的,大部分问题都能查阅官方文档解决。
如果还有其他问题也欢迎留言联系,或者加入QQ群: 121757667 ,一起讨论和学习!