Я написал простой секундомер в React. Чтобы отображать новое число каждую секунду, я использовал setInterval:
import React, {useEffect, useState, useRef} from 'react';
const MAX_TIMER = 5;
export default function StopWatch() {
const [timer, setTimer] = useState(0);
const tickIntervalId = useRef(null);
const tickTimer = (getTimerTimeFn) => {
const number = getTimerTimeFn();
setTimer(number);
if(number === MAX_TIMER) {
clearInterval(tickIntervalId.current);
}
}
let i = 0;
console.log('i is: ', i) // i value is 0 every render
const incrementNumber = () => {
i += 1;
console.log('in incrementNumber, i is: ', i); // i value is incrementing every render: 1, 2, 3, 4, 5. how?
return i;
}
useEffect(() => {
tickIntervalId.current = setInterval(tickTimer, 1000, incrementNumber);
}, [])
return (
<div>
{timer}
</div>
);
}
Code Sandbox
Вопрос в том, почему секундомер работает так, как ожидалось? Поскольку каждую секунду я повторно визуализирую компонент, строка let i = 0
выполняется снова, поэтому я ожидаю, что возвращаемое значение из incrementNumber
всегда будет 1 (0 + 1) Но вместо этого возвращаемое значение увеличивается: 1,2,3,4,5. Это вывод консоли:
i is: 0
in incrementNumber, i is: 1
i is: 0
in incrementNumber, i is: 2
i is: 0
in incrementNumber, i is: 3
i is: 0
in incrementNumber, i is: 4
i is: 0
in incrementNumber, i is: 5
i is: 0