Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Required props provided with cloneElement still display a warning in the console #4494

Closed
tleunen opened this issue Jul 27, 2015 · 3 comments

Comments

@tleunen
Copy link

tleunen commented Jul 27, 2015

I made an example so it's easier to understand, but basically a warning is displayed in the console because of "missing required props".

The props are given to the element with React.cloneElement so I wasn't expecting to get a warning of missing props. I understand this could be an edge case though...

https://jsfiddle.net/kdsvgbzu/1/

<A name="name" value="value">
    <B></B>
</A>
class A extends React.Component {
    render() {
        return (
            <div>
                {React.Children.map(this.props.children, function(child) {
                    return React.cloneElement(child, {
                        name: this.props.name,
                        value: this.props.value
                    });
                }, this)}
            </div>
        );
    }
}

A.propTypes = {
    name: PropTypes.string.isRequired,
    value: PropTypes.string.isRequired
};

class B extends React.Component {
    render() {
        return <span>{this.props.name} : {this.props.value}</span>;
    }
}

B.propTypes = {
    name: PropTypes.string.isRequired,
    value: PropTypes.string.isRequired
};
@tleunen tleunen changed the title Props provided with cloneElement but a warning is still displayed Required props, provided with cloneElement still display a warning in the console Jul 27, 2015
@tleunen tleunen changed the title Required props, provided with cloneElement still display a warning in the console Required props provided with cloneElement still display a warning in the console Jul 27, 2015
@sophiebits
Copy link
Collaborator

This is intentional; validating props at element creation time produces more useful errors. It also more closely matches the behavior of static type systems like Flow. Best for now is to simply mark those props optional. We also may introduce a feature in the future called context that will give another supported way to pass props from a parent like A to a child like B.

@tleunen
Copy link
Author

tleunen commented Jul 27, 2015

That's what I thought. Thanks @spicyj

@micaste
Copy link

micaste commented Mar 1, 2017

I don't know what was your real use-case @tleunen, but I stumbled upon this issue while implementing a reusable component that had the responsiblity to pass props to its children:

ReactDOM.render(
   <NumberSelector>
    <ComponentRequiringTheNumber />
  </NumberSelector>
)

In the end, I worked around the issue with what I found is a more elegant solution:

ReactDOM.render(
   <NumberSelector>
    {({number}) => <ComponentRequiringTheNumber number={number} />}
  </NumberSelector>
)

I like it much better since the dependency of ComponentRequiringTheNumber is explicit, and the role of NumberSelector becomes apparent. And this way, the props given to the nested component are only evaluated when it is relevant.

Applied to your Fiddle : https://jsfiddle.net/ap1e9rk3/1/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants