Значение списка рендеринга обновлено с помощью метода hook - PullRequest
0 голосов
/ 01 марта 2020

Существует приложение счетчика, которое должно визуализировать, как происходит обратный отсчет.

первый рендер должен быть 10

второй рендер должно быть 10 9

третий рендер должен быть 10 9 8

и т. д. *

Использование реакционных хуков для выполнения этой задачи является проблемой, поскольку компонент не перерисовывается при обновлении значения для переменной, хранящей значение обратного отсчета.

Таймер используется для обновления значения обратного отсчета каждые 1,5 секунды. В операторе console.log значение переменной обновляется, но повторная визуализация компонента не выполняется.

import React, { useState, useRef } from "react";

import Grid from "@material-ui/core/Grid";
import Typography from "@material-ui/core/Typography";
import Button from "@material-ui/core/Button";

const ListCounter = props => {
  const [count, setCount] = useState([10]);
  const [timerId, setTimerId] = useState(null);
  const countRef = useRef(count);
  countRef.current = count;
  const timerIdRef = useRef(timerId);
  timerIdRef.current = timerId;

  function calculate() {
    initialize();
  }

  const initialize = () => {
    setTimerId(
      setInterval(() => {
        let temp = countRef.current;
        if (temp[temp.length - 1] === 6) {
          clearInterval(timerIdRef.current);
          console.log("STOP!");
        } else {
          setCount(count => {
            temp.push(temp[temp.length - 1] - 1);
            console.log("TEMP: ", temp);
            return temp;
          });
        }
      }, 1500)
    );
  };

  return (
    <div>
      <Grid container justify="center">
        <Grid item>
          {count.map((v1, i) => {
            return (
              <Typography key={i} variant="h1" component="h2" gutterBottom>
                {v1},
              </Typography>
            );
          })}

          <Button variant="contained" onClick={calculate}>
            Count down
          </Button>
        </Grid>
      </Grid>
    </div>
  );
};

export default ListCounter;

Найдите ссылку CodeSandbox для полного кода

* 1024. * Любые предложения приветствуются.

Edit nifty-frost-6hev3

1 Ответ

0 голосов
/ 01 марта 2020

Спасибо @JaredSmith за указание в правильном направлении.

const initialize = () => {
    setTimerId(
      setInterval(() => {
        let temp = countRef.current.slice(); // <---------
        if (temp[temp.length - 1] === 6) {
          clearInterval(timerIdRef.current);
          console.log("STOP!");
        } else {
          setCount(count => {
            temp.push(temp[temp.length - 1] - 1);
            console.log("TEMP: ", temp);
            return temp;
          });
        }
      }, 1500)
    );
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...