How to access one component's state from another component

JavascriptReactjs

Javascript Problem Overview


How do I access one component's state in another component? Below is my code and I'm trying to access the state of component a in component b.

var a = React.createClass({
    getInitialState: function () {
        return {
            first: "1"
        };
    },

    render: function () {
        // Render HTML here.
    }  
});

var b = React.createClass({
    getInitialState: function () {
        return {
            second: a.state.first
        };
    },
    
    render: function () {
        // Render HTML here.
    }  
});

But I'm not getting anything.

Javascript Solutions


Solution 1 - Javascript

Even if you try doing this way, it is not correct method to access the state. Better to have a parent component whose children are a and b. The ParentComponent will maintain the state and pass it as props to the children.

For instance,

var ParentComponent = React.createClass({
  getInitialState : function() {
    return {
      first: 1,
    }
  }
  
  changeFirst: function(newValue) {
    this.setState({
      first: newValue,
    });
  }
  
  render: function() {
   return (
     <a first={this.state.first} changeFirst={this.changeFirst.bind(this)} />
     <b first={this.state.first} changeFirst={this.changeFirst.bind(this)} />
   )
 }
}

Now in your child compoenents a and b, access first variable using this.props.first. When you wish to change the value of first call this.props.changeFirst() function of the ParentComponent. This will change the value and will be thus reflected in both the children a and b.

I am writing component a here, b will be similar:

var a = React.createClass({

  render: function() {
    var first = this.props.first; // access first anywhere using this.props.first in child
    // render JSX
  }
}

Solution 2 - Javascript

If two components need access to the same state they should have a common ancestor where the state is kept.

So component A is the parent of B and C. Component A has the state, and passes it down as props to B and C. If you want to change the state from B you pass down a callback function as a prop.

Solution 3 - Javascript

I would suggest you use a state manager like Redux (personal favorite), MobX reflux, etc to manage your state.

How these works is they allow you to contain all shared state in one state storage (called a store), and whatever component needs access to a part of that shared state, it will just get it from the store.

It looked very hard to get started with but once you get over the small challenges, get 2 or 3 "wtf's" out of the way. It gets easier.

Take a look here: http://redux.js.org/

EDIT: Redux is good but the boilerplate code is really a turn off... for those of you looking for a simpler, more magical (this can be good and bad) solution use mobx : https://mobx.js.org/

Solution 4 - Javascript

in the child component create function that sets the state:

changeTheState(){
    this.setState({something:"some value"})
}

and in parent component give the child a ref as following:

<Child ref={component => this._child = component}/>

then in parent make a function to access the changeTheState()

parentFunction(){
    this._child.changeTheState();
}

and just use the parentFunction.

Solution 5 - Javascript

If you have A and B component where B is a child of A, you can pass a function to change the state of A though props to B.

function B(props) {
    return <button onClick={props.changeA} />
}

class A extends React.Component {

    //constructor
    //pass this function to B to change A's state
    handleA() {
        this.setState({});
    }
 
    render() {
        return <B changeA={() => this.handleA()} />
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVamshi Krishna LakkarsView Question on Stackoverflow
Solution 1 - JavascriptNaisheel VerdhanView Answer on Stackoverflow
Solution 2 - JavascriptJegerView Answer on Stackoverflow
Solution 3 - JavascriptAlly JrView Answer on Stackoverflow
Solution 4 - JavascriptHassan KandilView Answer on Stackoverflow
Solution 5 - Javascriptminhguy.View Answer on Stackoverflow