gpbaculio
gpbaculio

Reputation: 5968

How do I pass parent state to its child components?

I am new in React ES6 and I think I am modifying the state in a wrong way. My code is like this when I set state on parent component:

class App extends React.Component  {
constuctor(props)  {
     super(props);
     this.state = {name:"helloworld"};
}
 render() { 
  return( 
   <ChildComponent parentObj={this} /> // parentObj for parent context as props on child components  
  ); 
 } 
}

My problem is in other child components, I have to do it repeatitively, is there another way of doing it? I have no problem with React.createClass, but I want to code in es6 so i have this problem.

Upvotes: 21

Views: 43095

Answers (2)

challenger
challenger

Reputation: 2214

If you wanna pass the state {name:"helloworld"} do it like that:

class App extends React.Component {
constuctor(props)  {
     super(props);
     this.state = {name:"helloworld"};
}
 render() { 
  return( 
   <ChildComponent {...this.state} /> 
  ); 
 } 
}

and in the child component you can do:

<Text>{this.props.name}</Text>

But If you want to pass the props of the component to it's child:

   class App extends React.Component {
    constuctor(props)  {
         super(props);
         this.state = {name:"helloworld"};
    }
     render() { 
      return( 
       <ChildComponent {...this.props} />
      ); 
     } 
    }

and in the child component you can do:

<Text>{this.props.stuff}</Text>//place stuff by any property name in props

Now if you want to update the state of parent component from the child component you will need to pass a function to the child component:

 class App extends React.Component {
    constuctor(props)  {
         super(props);
         this.state = {name:"helloworld"};
    }
    update(name){
       this.setState({name:name})// or with es6 this.setState({name})
    }
    render() { 
     return( 
      <ChildComponent {...this.props, update: this.update.bind(this)} />
     ); 
    } 
  }

and then in child component you can use this : this.props.update('new name')

UPDATE

use more es6 and removed constructor

class App extends React.Component {
    state = {name:"helloworld"};

    // es6 function, will be bind with adding .bind(this)
    update = name => {
       this.setState({name:name})// or with es6 this.setState({name})
    }

    render() { 
     // notice that we removed .bind(this) from the update
     return(
     //send multiple methods using ','
      <ChildComponent {...this.props, update = this.update} />
     ); 
    } 
  }

Upvotes: 35

Ji aSH
Ji aSH

Reputation: 3457

if you want to send the whole state :

return( <ChildComponent {...this.state} /> );

But this is likely a bad idea :)

edit: in your scenario, this sends a 'name' property to child component with value 'helloworld'

Upvotes: 0

Related Questions