为了支持嵌套导航菜单,我们使用 React.cloneElement 向子菜单组件添加属性(菜单组件是基于 react-bootstrap 的自定义组件)。为了防止我们克隆所有元素,即使它们不是子菜单组件,而是常规内容组件,我想让克隆有条件。
所有菜单组件都是“MenuBase”的子类(它本身是 React.Component 的子类)。在我的代码中,我尝试测试 React 组件的子组件(通过使用 React.Children 实用程序函数读取 this.props.children)是否是 MenuBase 的实例。
简化代码:
interface IMenuBaseProps {
// menu related properties
}
abstract class MenuBase<P extends IMenuBaseProps, S> extends React.Component<P, S> {
// constructor etc.
}
interface IGeneralMenuProps extends IMenuBaseProps {
// additional properties
}
class GeneralMenu extends MenuBase<IGeneralMenuProps, {}> {
public render(): JSX.Element {
// do some magic
}
}
在菜单逻辑的某个地方,我想做如下事情
React.Children.map(this.props.children, (child: React.ReactElement<any>): React.ReactElement<any> ==> {
if (child instanceof MenuBase) {
// return clone of child with additional properties
} else {
// return child
}
}
但是,此测试永远不会结果为真,因此永远不会进行克隆。
在 Chrome 开发人员工具中,我可以看到:
- child.type = 函数 GeneralMenu(props)
- child.type.prototype = MenuBase
有人可以帮我澄清以下问题:
- 为什么 instanceof 不起作用
- 如果我无法将测试实例用于react组件继承链中的某些内容,那么我的替代方案是什么(我知道我可以测试 IMenuBaseProps 的属性之一是否存在,但我真的不喜欢该解决方案)。