我正面临着一个挑战,我必须根据子组件的类型来组织它们。
假设我们有一个名为Modal
的父组件,定义如下:
interface IModalProps {
children: ModalHeader | ModalBody | ModalFooter;
}
function Modal({ children }: IModalProps) { ... }
还有其他子组件将嵌套在父Modal
组件中;
function ModalHeader(props) { ... }
function ModalBody(props) { ... }
function ModalFooter(props) { ... }
我想做的是在我的index.tsx
中使用这些组件,如下所示;
<Modal>
<ModalHeader />
<div /> { /* Desired error: type 'div' does not exist in type 'ModalHeader | ModalBody | ModalFooter' */ }
<ModalBody />
<ModalFooter />
</Modal>
因此,通过使用IModalProps
接口定义的children
属性,我可以访问Modal
组件中的所有这些嵌套组件,在如上嵌套它们之后。然而,它只会给我数组中的组件,我不知道哪个元素代表哪个子组件。我希望能够在父组件中识别这些子组件的类型,这样我就可以使用它们来应用特定的条件或布局。例如,我可能想把ModalHeader
组件放在div
中,在那里我应用了特殊的条件和样式,或者我可能想通过使用关于它们类型的信息,为所有子组件设置一个特定的显示顺序作为布局约束。
有没有办法让我实现这一点,而不传递这些组件作为命名属性?
谢谢。
您可以将子道具的type
属性与相关组件类型或Modal
组件中的type.name
属性进行比较,如下所示:
React.Children.forEach(children, child => {
if (child.type === ModalHeader || child.type.name === ModalHeader.name) {
console.log('Header Component');
}
});
注意:只需要检查一次(type
或type.name
),这取决于您正在使用的软件包的版本。