Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing/Accessing props in stateless child component

Tags:

I know you can pass all a react components props to it's child component like this:

const ParentComponent = () => (    <div>      <h1>Parent Component</h1>      <ChildComponent {...this.props} />    </div> ) 

But how do you then retrieve those props if the child component is stateless? I know if it is a class component you can just access them as this.prop.whatever, but what do you pass as the argument into the stateless component?

const ChildComponent = ({ *what goes here?* }) => (    <div>       <h1>Child Component</h1>    </div> ) 
like image 991
Paulos3000 Avatar asked Jan 23 '17 18:01

Paulos3000


People also ask

Can a stateless component have props?

Stateful and Stateless Components In React, a stateful component is a component that holds some state. Stateless components, by contrast, have no state. Note that both types of components can use props.

How do you pass Props to child component React?

There is no way to pass props up to a parent component from a child component. We will revisit this caveat later in this tutorial. It's also important to note that React's props are read only (immutable). As a developer, you should never mutate props but only read them in your components.


2 Answers

When you write

const ChildComponent = ({ someProp }) => (    <div>       <h1>Child Component {someProp}</h1>    </div> ) 

From all the props that you are passing to the childComponent you are just destructuring to get only someProp. If the number of props that you want to use in ChildComponents are countable(few) amongst the total number of props that are available, destructuring is a good option as it provides better readability.

Suppose you want to access all the props in the child component then you need not use {} around the argument and then you can use it like props.someProp

const ChildComponent = (props) => (    <div>       <h1>Child Component {props.someProp}</h1>    </div> ) 
like image 90
Shubham Khatri Avatar answered Oct 14 '22 22:10

Shubham Khatri


Are you looking for the ES6 named argument syntax (which is merely destructuring) ?

const ChildComponent = ({ propName }) => (     <div>      <h1>Child Component</h1>  </div> )  const ChildComponent = (props) => ( // without named arguments     <div>      <h1>Child Component</h1>  </div> ) 

Optionally there is a second argument to your function depending of whether you specified a context for your component or not.

Perhaps it would be more helpful wityh a links to the docs. As stated in the first article about functional components. Whatever props passed on to the component is represented as an object passed as first argument to your functional component.

To go a little further, about the spread notation within jsx.

When you write in a component :

<Child prop1={value1} prop2={value2} /> 

What your component will receive is an plain object which looks like this :

{ prop1: value1, prop2: value2 } 

(Note that it's not a Map, but an object with only strings as keys).

So when you're using the spread syntax with a JS object it is effectively a shortcut to this

const object = { key1: value1, key2: value2 } <Component {...object}/> 

Is equivalent to

<Component key1={value1} key2={value2} /> 

And actually compiles to

return React.createElement(Component, object); // second arg is props 

And you can of course have the second syntax, but be careful of the order. The more specific syntax (prop=value) must come last : the more specific instruction comes last.

If you do :

<Component key={value} {...props} /> 

It compiles to

React.createElement(Component, _extends({ key: value }, props)); 

If you do (what you probably should)

<Component {...props} key={value} /> 

It compiles to

React.createElement(Component, _extends(props, { key: value })); 

Where extends is *Object.assign (or a polyfill if not present).

To go further I would really recommend taking some time to observe the output of Babel with their online editor. This is very interesting to understand how jsx works, and more generally how you can implement es6 syntax with ES5 tools.

like image 33
adz5A Avatar answered Oct 14 '22 23:10

adz5A