@steklovatnik

Странное поведение setInterval с useState в React?

Разбирался с useEffect, решил на примере секундомера попрактиковаться. Итог - происходит черти что, счетчик постоянно ускоряется, и как-будто отсчитывается до нового значения заново от нуля каждую секунду, что происходит? почему так?

P.S. без useEffect тоже так работает

Код ниже:

import { useState, useEffect } from "react";

export default function Stopwatch(props) {

  const [number, setNumber] = useState(0);

  useEffect(() => {
    setInterval(() => {
      console.log("ticking");
      setNumber((prevCount) => prevCount + 1);
    }, 1000);
  });

  return (
    <div className="stopwatch">
      <h2>stopwatch</h2>
      <div>{number}</div>
    </div>
  );
}
  • Вопрос задан
  • 297 просмотров
Решения вопроса 1
Seasle
@Seasle Куратор тега React
useEffect без массива значений, за которым надо следить (dependencies), будет срабатывать при каждом рендере. Изменение состояния вызывает новый рендер, который в свою очередь вызывает useEffect.
Исправить можно так:
useEffect(() => {
    const intervalId = setInterval(() => {
        console.log("ticking");
        setNumber((prevCount) => prevCount + 1);
    }, 1000);

    return () => clearInterval(intervalId);
}, []);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы