Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 反应效果和清除间隔_Reactjs - Fatal编程技术网

Reactjs 反应效果和清除间隔

Reactjs 反应效果和清除间隔,reactjs,Reactjs,我有一个按钮,可以将名为start的状态从true切换到false。如果为true,则您希望查看控制台日志,只要我按stop,我就希望日志停止 useEffect(() => { let timePassed = 0; let timeLeft = timeLimit; if (start) { const timerInterval = setInterval(() => { timePassed += 1;

我有一个按钮,可以将名为
start
的状态从true切换到false。如果为true,则您希望查看控制台日志,只要我按stop,我就希望日志停止


  useEffect(() => {
    let timePassed = 0;
    let timeLeft = timeLimit;
    if (start) {
      const timerInterval = setInterval(() => {
        timePassed += 1;
        if (!start) {
          console.log('stop')
          clearInterval(timerInterval);
        }
        console.log('start')
      }, 100);
    }
  }, [start]);


控制台永远不会停止记录
start

本地变量
start
永远不会更改,即使您调用
setStart
。调用
setStart
只是一条指令,用于再次对渲染组件做出反应。在该新渲染上,将创建一个新的局部变量,其start等于false,但上一次渲染的效果永远不会看到这一点

相反,您需要的是返回一个拆卸函数。第二次调用效果时,react将调用上一次的“拆卸”函数

useEffect(() => {
  let timePassed = 0;
  let timeLeft = timeLimit;
  if (start) {
    const timerInterval = setInterval(() => {
      timePassed += 1;
      console.log('start')
    }, 100);

    return () => {
      console.log('stop')
      clearInterval(timerInterval);
    }
  }
}, [start])

我试过了,同样的情况