检查 React 组件的类型

IT技术 reactjs
2021-04-17 07:16:56

我需要遍历组件children并仅在子组件是特定类型时才执行某些操作:

React.Children.forEach(this.props.children, child => {
    if (...) {
        console.log('Suitable component!');
    }
});
4个回答

这是你应该做的:

import MyComponent from './MyComponent';

this.props.children.forEach(child => {
    if (child.type === MyComponent) {
        console.log('This child is <MyComponent />');
    }
});
没有name它就停止工作。目前这让我感到惊讶,因为我也认为它应该有效。
2021-06-08 07:16:56
@KonstantinSmolyanin 考虑提供一种方法来复制问题中的问题。如果child恰好是MyComponenttype元素,它应该可以工作。
2021-06-08 07:16:56
你不应该通过name您只需编写` child.type === MyComponent`。确保这是您的组件而不是字符串。我正在更新我的答案,所以你知道 MyComponent 来了
2021-06-11 07:16:56
我发现问题了!如此奇怪的行为是由react-hot-loader我在开发模式下使用引起的
2021-06-13 07:16:56
它按预期在没有名称的情况下工作。如果我发现在我的特定情况下发生了什么,我会在这里发表评论(因为在我的应用程序中,它仍然无法在没有名称的情况下工作)。我将此答案标记为已接受。
2021-06-16 07:16:56

正如康斯坦丁·斯莫利亚宁 (Konstantin Smolyanin) 所指出的那样,接受的答案可能与 react-hot-loader 配合得不好。

一个希望更安全的选择,这里建议

import MyComponent from './MyComponent';
const myComponentType = (<MyComponent />).type;

this.props.children.forEach(child => {
    if (child.type === myComponentType ) {
        console.log('This child is <MyComponent />');
    }
});

其他解决方案:

import MyComponent from './MyComponent';
// const myComponentType = (<MyComponent />).type;
// It's the same than
const myComponentType = React.createElement(MyComponent).type;

this.props.children.forEach(child => {
    if (child.type === myComponentType) {
        console.log('This child is <MyComponent />');
    }
});

我目前的解决方案是

import MyComponent from 'MyComponent';

...


React.Children.forEach(this.props.children, child => {
    if (child.type.name === MyComponent.name) {
        console.log('Suitable component!');
    }
});

但我看到typeReact 元素的属性没有记录(或者我不擅长阅读文档?)。所以我正在寻找更可靠的解决方案。

更新:

实际上代码if (child.type.name === MyComponent.name)应该简化为if (child.type === MyComponent). 但这对我不起作用。我发现它是由react-hot-loader. 禁用它修复了我的应用程序。

react-hot-loaderGitHub 上的相关问题https : //github.com/gaearon/react-hot-loader/issues/304

你可能读错了地方。child不是 React组件而是element按名称匹配类在客户端没有意义。大多数类将被缩小为类似a或的内容e
2021-05-26 07:16:56
它没有详细记录,因为 React 文档是一个重要的指南。请参阅reactjs.org/docs/react-api.html#createelementreactjs.org/docs/react-api.html#cloneelementtype在那里进行了解释。
2021-06-10 07:16:56
@estus ...是的,元素,谢谢你的澄清。你能提供一个 ReactElement 官方文档的链接吗?我真的在这里找不到:reactjs.org/docs/react-api.html
2021-06-12 07:16:56