Use Component State Initializers

Kent C. Dodds
InstructorKent C. Dodds
Share this video with your friends

Social Share Links

Send Tweet
Published 6 years ago
Updated 5 years ago

In this lesson, we'll allow users to initialize our component's state with their own defaults and support a reset functionality to reset to the initial state.

Instructor: [00:00] Right now we're initializing our toggle state to be on as false. We could change that to initialize it as true, but what if we wanted to make this dynamic? That's simple enough. We just turn this into a prop.

[00:14] We have this.props.defaultOn. Then we can go into here and say defaultOn is true. Now anybody using the toggle component can default to whatever state they want it to default to.

[00:27] Now, what if I wanted to add the ability to reset the state of the toggle component back to whatever the default was. Let's go ahead and add that. We'll add a div here and a button that says Reset. Then onClick. We're going to want to do something with the toggle object that we get here. We'll say toggle.reset. We'll do that in a callback function.

[00:52] Then let's go ahead and build this. We'll say reset equals this.reset. Then we'll add reset=this arrow function. We can just say this.setStateOn is this.props.defaultOn. Now if we turn it off and then reset, it should update to the initial state.

[01:14] Now just for good measure let's go ahead and add an onReset callback here. That will take on and we'll console that log resetOn. Then when we do this setState, we'll do a callback function. We'll say this.props.onReset with this.state.on.

[01:35] Now if we pop open our developer tools, we can toggle that. We'll see toggle false and then reset. Reset is true. Now let's go ahead and add a default prop for onReset, just like we have for the onToggle, because it's not a required prop. Let's also add a default prop for defaultOn to be false.

[01:53] Let's do one last thing to make things a little bit more flexible. Right here we have the exact same duplication of code and that's fine, because it's a pretty small object. If it were to be of significant size it might be kind of nice to not have to duplicate all of that code.

[02:06] What we're going to do is we'll call this initialState and then we'll say state=this.initialState. Then when we do our reset we just call this.setState with this.initialState. Everything continues to work.

[02:22] This is a state initializer. It allows me to initialize the state however I want it to via props, and that initialization happens during the construction phase of our component.

[02:32] Then we expose a reset function which we can use to reset the state to the initial state, which we created based off of the default props when our component was constructed in the first place. Then we also added this handy onReset function and a default for that.

egghead
egghead
~ 34 minutes ago

Member comments are a way for members to communicate, interact, and ask questions about a lesson.

The instructor or someone from the community might respond to your question Here are a few basic guidelines to commenting on egghead.io

Be on-Topic

Comments are for discussing a lesson. If you're having a general issue with the website functionality, please contact us at support@egghead.io.

Avoid meta-discussion

  • This was great!
  • This was horrible!
  • I didn't like this because it didn't match my skill level.
  • +1 It will likely be deleted as spam.

Code Problems?

Should be accompanied by code! Codesandbox or Stackblitz provide a way to share code and discuss it in context

Details and Context

Vague question? Vague answer. Any details and context you can provide will lure more interesting answers!

Markdown supported.
Become a member to join the discussionEnroll Today