Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

React: Passing Props to Descendants

Tags:

Is there a recommended pattern for passing props to descendant components in React?

Below, I'm passing the prop callback to a child component:

Master = React.createClass({   render: function() {     return (       <div>         <ListComp items={this.props.items} callback={this.handleClick} />       </div>     );   } });  ListComp = React.createClass({   render: function() {      this.props.items.forEach(function(item) {       items.push(<ItemView item={item} callback={this.props.callback} />);     }, this);      return (       <ul>{items}</ul>     );   } }); 

And then the callback prop gets handed down to the descendant component:

ItemComp = React.createClass({   render: function() {     return (       <li><a onClick={this.handleClick} href="#">Link</a></li>     );   },    handleClick: function(e) {     e.preventDefault();     this.props.callback();   } }); 

Is it correct to pass the prop down twice like this or should I be referencing its inheritance somehow?

I see a transferPropsTo method in the docs, and from logging it looks like I could get to callback from the descendant via this.props.__owner__.props but those double-double underscores make me think I shouldn't.

like image 370
cantera Avatar asked Feb 13 '14 15:02

cantera


People also ask

How do you pass Props to state in React?

Component { state = { description: '' } constructor (props) => { const { description } = props; this. state = {description}; } render () { const {state: { description }} = this; return ( <input type="text" value={description} /> ); } } export default SecondComponent; Update: I changed setState() to this.

Can you pass a component as a prop React?

You can pass a component as props in React by using the built-in children prop. All elements you pass between the opening and closing tags of a component get assigned to the children prop.

How do you pass children in React?

Children are props If you want to pass things to this button, you would use a prop. If you want to make our button say more than just "I am a button," you can pass children to it. By passing children in this way, you are passing it to the component by position.


1 Answers

Yes, this is idiomatic. Think of each component as a function whose arguments are the props – with that perspective, passing around the props explicitly seems a lot more normal. We've found that it makes things more maintainable to have everything be explicit so you can see what all the inputs to a component are and exactly what you're passing.

(A future version of React will probably include a feature called "contexts" which makes it possible to pass things down implicitly, but it will probably make code harder to reason about so I'd still favor explicitness almost all of the time.)

UPDATE (not by original author)

The documentation has finally been added (it was added sometime between summer 2015 and summer 2016, probably with release 0.14):

Official React Context Documentation.

Note that this is also how react-redux simplifies passing of stores through the hierarchy.

like image 200
Sophie Alpert Avatar answered Sep 26 '22 00:09

Sophie Alpert