这次再说一说父子组件之间的传值与通信场景。
Vue3 中从父级向子级传值与 Vue2 一样,就是在模板里创建子组件的标签时,通过 v-bind:
/:
指令传值。
而父组件通过 v-on:
/@
绑定的事件监听器,需要在子组件触发事件时,需要通过 props
之后的第二个参数 context
调用:
// child.vue
export default {
setup(props, context) {
const onClick = () => context.emit('click-child');
// ...
},
};
同时,context
中还提供了我们操作子组件时经常需要用到的插槽 slots
:
// parent.vue
export default {
setup(props, context) {
const { slots } = context;
const children = (slots.default ? slots.default() : []);
// ...
},
};
顺带一提,由于 context
不是响应式的,所以我们可以直接在参数表中,使用解构赋值取出 emit
和 slots
:
// parent.vue
export default {
setup(props, { emit, slots }) {
// ...
},
};
不过需要注意,slots
的属性值也可能随时发生变化,但它本身并非响应式数据。为了确保你的组件随时获得最新的插槽状态,建议在 onUpdated
中操作其属性值。
我们有时会遇到类似这样的需求(比如:Tab 与 TabPane),所有子组件需要根据同一个父组件/祖先组件的状态调整自身的状态,做到跨级数据联动。
在 Vue2 中,是被打散在不同构造参数中的 provide
和 inject
属性实现的:
// tab.vue
exports default {
data() {
return {
tabState: {
// ...
};
},
},
// ...
provide() {
// 向子孙组件提供 tabState
const { tabState } = this;
return {
tabState,
};
},
};
// tab-pane.vue
exports default {
// 告知可以注入来自祖先的 tabState
inject: [ tabState ],
// ...
methods: {
getTabState() {
// 取用 provide 过来的数据
const { tabState } = this;
// ...
},
},
};
可以看到,又是被打散到不同 data
/methods
/computed
段落的零散数据,靠 this
强行绑定到一起。
在 Vue3 中,则是通过 provide
和 inject
函数,更直观地组装出来:
// tab.vue
import { reactive, provide } from 'vue';
exports default {
setup() {
const tabState = reactive({
// ...
});
provide('tabState', tabState);
// ...
},
};
// tab-pane.vue
import { inject } from 'vue';
exports default {
setup() {
const tabState = inject('tabState');
// 还可以传入一个默认值: const tabState = inject('tabState', { });
// ...
},
};
传入响应式数据后,在子孙组件都可以方便地取到,以至于甚至可以替代很多 Vuex 的使用场景。
这一系列至此告一段落,Vue3 的组装 API 使用起来还是相对简单的,大部分问题都能查阅官方文档解决。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有