1

I have a fairly simple stateful component whose value I wish to toggle whenever someone clicks on a button:

class Layout extends Component {
  state = {
    sidedrawer: false
  }

  sideDrawerCloseHandler = () => {
    this.setState({sidedrawer: false})
  }

  sideDrawerTogglerHandler = () => {
    this.setState({sidedrawer: !sidedrawer})
  }

  render () {
    return (
      <Aux>
        <Toolbar sideDrawerTogglerHandler={this.sideDrawerTogglerHandler}/>
        <SideDrawer SideDrawerOpen={this.state.sidedrawer} sideDrawerCloseHandler={this.sideDrawerCloseHandler} />
        <main className={classes.co}>
          {this.props.children}
        </main>
      </Aux>
    )
  }
}

export default Layout;

Now, when I run my react App it throws an error saying:

sidedrawer is not defined in line 19

Can someone help me in fixing and understanding the error?

The line 18 - 19 happens to be this part in my code

sideDrawerTogglerHandler = () => {
  this.setState({sidedrawer: !sidedrawer})
}

2 Answers 2

5

You have to get sidedrawer from your state:

sideDrawerTogglerHandler = () => {
 this.setState((previousState) => {
   return {sidedrawer: !previousState.sidedrawer}
 })
}
Sign up to request clarification or add additional context in comments.

Comments

3

Side drawer isn't defined, what is defined is this.state.sidedrawer, what you are seeking is

      sideDrawerTogglerHandler = () => {
           this.setState({sidedrawer: !this.state.sidedrawer})
      }

But this isn't the best way to setState, as explained on React docs, the best way to update state based on the previous state is using setState with a function that receives the prevState as a prop, you can try this instead

 sideDrawerTogglerHandler = () => {
     this.setState((prevState) => ({
      sidedrawer: !prevState.sidedrawer 
    }));
   }

3 Comments

Thanks for your answer. What do you think about this method (this works though but any drawbacks)? sideDrawerTogglerHandler = () => { let sideDrawerToggler = this.state.sideDrawer; sideDrawerToggler = !sideDrawerToggler; this.setState({sidedrawer: sideDrawerToggler}) }
If a person clicks twice, really fast, both sideDrawerToggler can get their value before the first setState is executed, so maybe, just maybe if he is really fast, you cant get the wrong value. That's why react suggests that way to ensure you will always have the right value

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.