在下面的简单示例中,我正在寻找一种方法来获取例如CardBody
的孩子。
const Card = ({children}) => {
const cardHeadChild = ...;
const cardBodyChild = ...;
return (
<div>
{cardHeadChild}
{cardBodyChild}
</div>
)
}
const CardHead = () => <div>Head</div>
const CardBody = () => <div>Body</div>
// Usage:
<Card>
<CardHead>
<CardBody>
</Card>
因为子级是可选项,所以我无法按索引获取数据(例如:React.Children.toArray(children)[1]
)。
我尝试过这样的事情:
React.Children.forEach(children, child => {
if(child.type.name === 'CardBody') cardBodyChild = child
// or
if(child.type.displayName === 'CardBody') cardBodyChild = child
..
})
但是当组件包装在HOC中时,它不起作用。
任何解决方案吗?
答案 0 :(得分:2)
函数name
不应在生产客户端代码中使用,因为当应用程序缩小时,函数名称将被篡改。 displayName
同样适用-除非明确设置。还要注意,displayName
和name
的主要用法是调试。
孩子可以由React元素type
标识。如果目的是按照指定顺序输出可选子级,则可以类似于this answer进行此操作:
Optional head:
{props.children.find(({ type }) => type === CardHead)}
Optional body:
{props.children.find(({ type }) => type === CardBody)}
期望子级应该完全是CardHead
和CardBody
无状态组件。如果需要使用其他组件来增强其功能,CardHead
和CardBody
应该包装以下组件:
const CardHead = props => <div>
Head
{props.children}
</div>
...
<Card>
<CardHead><SomeComponent/></CardHead>
</Card>