Задать вопрос
AnyaDanilova
@AnyaDanilova
Начинающий фронтенд разработчик

Есть приложение на React (генератор случайных чисел), почему приложение работает неверно?

Описание:
Каждый раз, когда нажимаем на "Добавить число", в конец списка добавляется случайное число.
"Старт" — запускает интервал в 1 сек., который добавляет в конец списка случайное число.
"Стоп" — останавливает таймер.

Помогите найти баг и если можно доработать код

import React from "react";
import "./styles.css";

export default function App() {
  let timer = null;
  const [numbers, setNumbers] = React.useState([1, 2, 3]);

  const addRandomNumber = () => {
    const random = Math.round(Math.random() * 10);
    setNumbers([...numbers, random]);
  };

  const start = () => {
    timer = setInterval(addRandomNumber, 1000);
  };

  const stop = () => {
    clearInterval(timer);
  };

  return (
    <div className="App">
      <ul>
        {numbers.map(num => (
          <li>{num}</li>
        ))}
      </ul>
      <div className="buttons">
        <button onClick={() => addRandomNumber()}>Добавить число</button>
        <button onClick={() => start()}>Старт</button>
        <button onClick={() => stop()}>Стоп</button>
      </div>
    </div>
  );
}
  • Вопрос задан
  • 939 просмотров
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Merion Academy
    Frontend-разработка на React
    4 месяца
    Далее
  • ProductStar
    React: отточите навыки интерфейсной разработки
    6 недель
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега React
Теряете значение, которое возвращает setInterval. Нужен ещё один useState.

При обновлении numbers внутри addRandomNumber используете значение, которое было на момент создания addRandomNumber. Функции обновления состояния вместо нового значения можно передать функцию - она получает в качестве аргумента текущее значение и должна вернуть новое.

function App() {
  const [ numbers, setNumbers ] = React.useState([ 1, 2, 3 ]);
  const [ timerId, setTimerId ] = React.useState(null);

  const add = () => setNumbers(numbers => [ ...numbers, Math.random() * 10 | 0 ]);
  const start = () => setTimerId(setInterval(add, 1000));
  const stop = () => (clearInterval(timerId), setTimerId(null));

  return (
    <div>
      <ul>
        {numbers.map(n => <li>{n}</li>)}
      </ul>
      <div>
        <button onClick={add} disabled={timerId}>Добавить число</button>
        <button onClick={start} disabled={timerId}>Старт</button>
        <button onClick={stop} disabled={!timerId}>Стоп</button>
      </div>
    </div>
  );
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽