Задать вопрос
@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>
  );
}
  • Вопрос задан
  • 450 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • beONmax
    Профессия Frontend разработчик
    12 месяцев
    Далее
  • beONmax
    Профессия Веб разработчик
    10 месяцев
    Далее
  • Нетология
    Frontend-разработка на React
    10 недель
    Далее
Решения вопроса 1
Seasle
@Seasle Куратор тега React
useEffect без массива значений, за которым надо следить (dependencies), будет срабатывать при каждом рендере. Изменение состояния вызывает новый рендер, который в свою очередь вызывает useEffect.
Исправить можно так:
useEffect(() => {
    const intervalId = setInterval(() => {
        console.log("ticking");
        setNumber((prevCount) => prevCount + 1);
    }, 1000);

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

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

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽