无法读取 setInterval(Hooks)中的最新状态变量

IT技术 javascript reactjs
2021-05-24 12:40:39

我想这是因为 JS 是如何工作的,但我想你的类不会有这个问题。在这段代码中:

  let [open, setOpen] = React.useState(false);
  let [counter, setCounter] = React.useState(0);

  function handleClick() {
    setOpen(true);

    setInterval(() => {
      console.log(counter);
      setCounter(counter + 1);
    }, 2000);
  }

如果我调用 handleClick一次(例如单击按钮),则登录到控制台的值始终为 0(尽管每次都更新状态)。

这可能是因为关闭。但是,如果我想counter在这种设置中查看 的最新值怎么办?使用您可以完成的课程this.state.counter,它会读取最新值。是否有一些使用钩子的解决方法? 演示.


注意:我发现这个问题基本上是一样的。不知何故,我在最初的搜索中没有遇到它。

1个回答

检查下一个示例,参考setStatereact 文档。

export default function SimpleSnackbar() {
  const classes = useStyles();
  let [open, setOpen] = React.useState(false);
  let [, setCounter] = React.useState(0);

  // Save reference for clearing the interval
  // in your case you firing an interval on every click
  const lastInterval = useRef();

  // Side effect on `open` change.
  useEffect(() => {
    if (lastInterval.current) clearInterval(lastInterval.current);
    if (open) {
      lastInterval.current = setInterval(() => {

        // Functional setState
        setCounter(prevCounterValue => {
          console.log(prevCounterValue);
          return prevCounterValue + 1;
        });

      }, 1000);
    }
  }, [open]);

  function handleClick() {
    setOpen(true);
  }

  function handleClose(event, reason) {
    if (reason === 'clickaway') {
      return;
    }
    setOpen(false);
  }

  ...
}

编辑材料演示