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

    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>
      );
    }
    Ответ написан
    Комментировать