Search code examples
reactjschildren

React - how to determine if a specific child component exists?


If I have this structure:

const MyComponent = (props) => {
    return (
        <Wrapper />{props.children}</Wrapper>
    );
}

and I use it like this:

<MyComponent>
    <SomeInnerComponent />
</MyComponent>

How can I check to see if <SomeInnerComponent /> has specifically been included between <MyComponent></MyComponent>, from within the MyComponent function?


Solution

  • Given that you want to check that SomeInnerComponent is present as a child or not, you could do the following

    const MyComponent = (props) => {
        for (let child in props.children){
           if (props.children[child].type.displayName === 'SomeInnerComponent'){
              console.log("SomeInnerComponent is present as a child");
            }  
        }
        return (
            <Wrapper />{props.children}</Wrapper>
        );
    }
    

    Or you could have a propTypes validation on your component

    MyComponent.propTypes: {
        children: function (props, propName, componentName) {
          var error;
          var childProp = props[propName];
          var flag = false;
    
          React.Children.forEach(childProp, function (child) {
            if (child.type.displayName === 'SomeInnerComponent') {
               flag = true
            }
          });
          if(flag === false) {
               error = new Error(componentName + ' does not exist!'
              );
          }
          return error;
        }
      },