I really want to understand the lifecycle of react functional component. In many websites you see these three steps:
1-mounthing 2-render 3-unmounthing.
But what about other code that is written before useeffect() function for example assume this:
const Countdown = () => {
let x = 0;
const [countDown, setCountDown] = useState(10)
x = x + 1
if(x > 100) {
x = 0
}
useEffect(() => {
const interval = setInterval(() => {
setCountDown(countDown - 1);
console.log(x)
}, 1000);
}, [countDown]);
};
I want to know :
when countDown state and x variable is declared before useEffect or after it (or inside it)?
when
if
orfor
phrases is declared(in this exampleif
phrase), Are they inside useEffect indeed?
what is loading page order? what is start point of executing?
The lifecycle
It's more like (docs):
useLayoutEffect
)useEffect
))useLayoutEffect
)useEffect
))Your Questions
Before. The React library can't change how JavaScript code execution occurs. The
useState
call and associated declarations are before theuseEffect
call, so they happen before it.No, only the code within the
useEffect
callback is called as an effect.How your code runs
The cycle here is:
x
variable and sets it to0
.countDown
andsetCountDown
and callsuseState
, which allocates a state slot in the instance storage; your code stores whatuseState
returns (the initial state value and the setter) in those constants.x = x + 1
statement runs, updatingx
to1
.if
statement runs, but the condition will never be true —x
is a local variable, not a state member, so its value will always be1
at this point.useEffect
schedules an effect callback for whencountDown
changes.Countdown
.Countdown
should return and commits them to the DOM (making the DOM show what they describe).useEffect
callback (useEffect
callbacks are always called just after mount)setCountDown
.x
, which will be1
.setCountDown
, changing the value.x
variable and sets it to0
.countDown
andsetCountDown
and callsuseState
, which retrieves the updated state from the instance storage; your code stores whatuseState
returns (the current state value and the setter) in those constants.x = x + 1
statement runs, updatingx
to1
.if
statement runs, but the condition will never be true.useEffect
schedules an effect callback for whencountDown
changes.Countdown
.countDown
changed, React calls youruseEffect
callbacksetCountDown
.x
, which will be1
.Issues with the code
There are a couple of bugs in the code you've shown
countDown
changes. This will quickly lead to hundreds and then thousands of timers all triggering update calls. You should:countDown
as a dependency, so the effect only runs on mount. Then use the callback form ofsetCountDown
.x
to be maintained between calls to the function, but it's a local variable, so it's re-created each time.countDown
reaches0
, so it will just keep going to-1
,-2
, etc.Updated version
Here's an updated version with some notes. I was going to remove
x
because it wasn't really used for anything, but then thought it might be better to leave it with comments. And I didn't do anything about #4 above, because I wasn't sure what you wanted to do.If we wanted the countdown to stop when it reached
0
and turn off the timer, there are a couple of ways we might do that, see comments in the two live examples showing different ways: