Я сделал небольшой компонент секундомера, используя хуки в response. Это минимальный код, демонстрирующий проблему.
Посмотрите на функцию с именем resetTicks
. У него есть два установщика setTicks
и setTicking
, и работает только setTicking
, т.е. часы останавливаются, и что интересно, если я снова нажимаю кнопку, он сбрасывает часы. Я безуспешно пытался переупорядочить вызовы обоих сеттеров.
const StopWatch = () => {
const [ticks,setTicks] = useState(0);
const [ticking,setTicking] = useState(false);
useEffect(() => {
setTimeout(() => {
if (ticking) setTicks(ticks + 1);
},10);
},[ticks,ticking]);
const toggleTicking = e => {
setTicking(!ticking);
}
const resetTicks = e => {
// these two setters are causing the issue
// only the setTicking is actually showing effect. I have tried switching
// their order but nothing works.
setTicking(false);
setTicks(0);
}
const min = Math.floor(ticks / 6000);
const sec = Math.floor((ticks - (min * 6000)) / 100);
const centis = ticks % 100;
return (
<WatchWrapper>
<WatchDisplay>
<span>{min < 10 ? '0': ''}{min}</span>
<span>:</span>
<span>{sec < 10 ? '0': ''}{sec}</span>
<span>:</span>
<span>{centis < 10 ? '0' : ''}{centis}</span>
</WatchDisplay>
<WatchControls>
<WatchBtn onClick={toggleTicking}>
{ticking ? 'stop' : 'play_arrow'}
</WatchBtn>
<WatchBtn onClick={resetTicks}>refresh</WatchBtn>
</WatchControls>
</WatchWrapper>
)
}
setTicks(0)
. Следовательно, компонент не перерисовывается. Попробуйте установить для него другое значение, кроме 0; - person Durgesh Pal   schedule 03.07.2020setTicks
с разными значениями. - person Sayam Qazi   schedule 03.07.2020