A state is a variable components can use.
To manage state, you need to use special ReactJS Hooks useState()
and useReducer()
.
State & VDOM connection
Everytime a setState() is called, the VDOM render is updated and the affected component is rerendered.
Example useState()
function Likes(){
const [likes, setLikes] = useState(0)
const handleClick = () => {
setLikes(likes + 1)
}
return(
<button onClick={handleClick}>
Likes: {likes}
</button>
)
}
useState() can only be used in the main component function, helper functions must have these variables passed as arguments to use them
setState() In the component function
function Message(){
const [count, setCount] = useState(1);
setCount(2)
return (
<p>
Hello {count}
</p>
);
}
Having setState() in the component function like this will cause an infinite loop because:
- Everytime a setState() is called, the VDOM reruns the component code
- When the component re-renders, it claled setState() This will make the component render infinitely
Countermeasures
You can make the setState() only called through an active function like:
function Message(){
const [count, setCount] = useState(1);
return (
<div>
<p>Hello {count}</p>
<button onClick={() => setCount(count + 1)}></button>
</div>
);
}
You could use ReactJS Effects with a empty array as a second argument to prevent multiple executions.
function Message(){
const [count, setCount] = useState(1);
useEffect(() => {
setCount(2)
}, []);
return (
<p>Hello {count}</p>
);
}