React useState Hook
An introduction on how to use useState Hook in your React application
Thursday, October 21, 2021
What is a React hook?
From the React's official documentation
Hooks are a new addition in React
16.8
. They let you use state and other React features without writing a class.
What does it mean?
To give you more context, before React v16.8
, we can only enable a component
to have a state and manage it if a component is created using a class
.
.jsx1234567891011121314151617181920
A Functional component
is mainly used as a dumb component where the decision on how to render it differently is derived from the props
it will receive from its parent component.
.jsx123456
If you notice, we need fewer keystrokes to create a functional component,
but the problem is it would not be reactive to state changes.
Let's try to mimic all the class component
behaviors to our function component
.
.jsx123456789101112
You can modify the component all day long; however, it won't react to state changes.
What if we can have the simplicity of the functional component
and still have
the ability to react to state changes?
React hooks to the rescue!
As per the title of this blog, I will only discuss useState
which is the solution related to our previous problem.
I will discuss the other types in another blog.
Here are some ways on how to can create a useState
hook:
.jsx123456789101112131415161718
As mentioned in the above examples, here's what you can pass in a useState
as an argument:
- nothing
- primitive value
- object or array
- function(discussed in this blog)
If you passed one, it would serve as the default state for that instance, else default state will be null
When useState
is invoked, it will return an array.
The first element is the state
and the second element is the state updater
.
.jsx123
A simpler and more readable way to access the state
and the state updater
is by using
the array destructing assignment
.
The convention for the second element is to prepend it with set
, then make it camelCase
.
.jsx1
Let's replicate the behavior of the class component in a function component using a useState
hook.
.jsx123456789101112
Hooray! We just created a much simpler stateful component using useState
.
Let's break down what happened.
We created a new state with a default value of some value
.
attribute
will serve as the variable containing the default and future value of this hook.
setAttribute
will be the function that can modify our state
.jsx1
We define a method that will handle the change event from our input
element.
.jsx123
We display the state
and attach handleStateChange
to onChange
event.
.jsx1234
You can also simplify further if you want
.jsx1
Does it mean we should not use a class component
ever again?
I always use the functional component
approach, but if I'm working on a very old codebase where there's no way to migrate to the newer version, I will use a class component
.
Also, it is written in the React documentation that There are no plans to remove classes from React
.
However, there are some use cases like when using Inheritance, creating Error Boundary, explicit lifecycle methods, and such that cannot be directly done using a functional component
, although there are many workarounds to apply the expected behavior.
Conclusion
useState
will simplify how we can create a component.
Less code means fewer bugs(if used properly) and is easier to read, resulting in better maintainability.