在父组件Parent
中,我使用render函数来条件性地渲染子组件。示例如下:
<Parent :index="1">
<Child> ... </Child>
<Child> ... </Child>
<Child> ... </Child>
</Parent>
在Parent
组件的render函数中,有以下代码来实现条件性渲染子组件:
return () => {
const content = slots.default?.();
const children = content?.filter(child => child.type === Child);
const childToRender = children?.[props.index] ?? h('div')
return h('div', {}, () => [childToRender]);
}
这段代码按预期正常工作。
然而,我想将其中一个子组件用另一个组件包裹起来,如下所示:
<Parent :index="1">
<Child> ... </Child>
<ChildWrapper> ... </ChildWrapper>
<Child> ... </Child>
</Parent>
其中ChildWrapper.vue
看起来是这样的:
<template>
<Child> <slot/> </Child>
</template>
显然,由于过滤函数(content?.filter(child => child.type === Child)
),它不会捕获到ChildWrapper
组件内部的Child
组件。
如果我检查ChildWrapper
VNode的children属性,它显示的是一个包含默认插槽函数的对象,而不是我期望的包含Child
组件的数组。所以我的问题是:如何获取嵌套的Child
组件?
问题背景
假设父组件是一个Tab
或Carousel
组件,而子组件是一个TabItem
或CarouselItem
组件。我创建ChildWrapper
组件的原因是为了扩展或覆盖默认Child
组件的一些属性。父组件和子组件来自一个组件库,它们并不知道ChildWrapper
的存在,因此父组件无法控制ChildWrapper
应该如何渲染。