为什么我无法清除setInterval?

卡里姆

我正在尝试在组件(例如Home here)在视图中渲染时创建一个自动计数器计数器应从1开始并在10处停止。但是我无法在10处清除setInterval。计数器仍在递增。问题是什么?

非常感谢。

export const Home = () => {

    const [counter, setCounter] = useState(1)
    let timer = useRef()


    const animate = () => {
        if(counter === 10){
          clearInterval(timer.current)
        }else{
          setCounter((previous) => previous + 1) 
        }
    }


    useEffect(() => {
        timer.current = window.setInterval(() => {
            animate()
        }, 900)
    
     }, [])



  return (
      <div style={{textAlign: "center"}}>
         <h1>{counter}</h1>
      </div>
  )
}
优素福

问题是animate在的初始值上关闭了函数counter,即1。因此,条件counter === 10永远不会评估为真。

这就是为什么您永远不应该对useEffect钩子的依赖项撒谎这样做可能会导致错误,因为关闭了先前组件渲染中的陈旧值。

解决方案

您可以摆脱animate()功能,并在useEffect挂钩内编写逻辑

function App() {
  const [counter, setCounter] = React.useState(1);
  const counterRef = React.useRef(counter);

  React.useEffect(() => {
    const id = setInterval(() => {
      // if "counter" is 10, stop the interval
      if (counterRef.current === 10) {
        clearInterval(id);
      } else {
        // update the "counter" and "counterRef"
        setCounter((prevCounter) => {
          counterRef.current = ++prevCounter;
          return prevCounter;
        });
      }
    }, 900);

    // clearn interval on unmount
    return () => clearInterval(id);
  }, []);

  return (
    <div style={{ textAlign: "center" }}>
      <h1>{counter}</h1>
    </div>
  );
}

ReactDOM.render(<App/>, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我无法清除setInterval?

来自分类Dev

反应为什么我的clearInterval无法停止setInterval?

来自分类Dev

为什么我无法控制 setinterval 和 clearinterval javascript?

来自分类Dev

为什么setInterval无法正常工作?

来自分类Dev

了解为什么git-filter-branch无法清除我的历史记录

来自分类Dev

为什么我的显示器无法在backgroud桌面上清除?

来自分类Dev

为什么清除不清除?

来自分类Dev

为什么setInterval(-> ...),0无法按预期运行?

来自分类Dev

为什么我的setInterval函数仅被调用一次?

来自分类Dev

为什么python无法确定根并使用标记清除?

来自分类Dev

谁能解释为什么内容无法清除?

来自分类Dev

为什么我不能使用javascript清除输入字段?

来自分类Dev

为什么我不能清除datagridview控件中的行?

来自分类Dev

为什么在重用之前我需要清除stringstream?

来自分类Dev

我返回时为什么清除了bool out变量?

来自分类Dev

为什么我不能在GWTP的UiBinder中清除FlexTable?

来自分类Dev

为什么我不能清除ArrayList的两个子列表

来自分类Dev

为什么我不能清除datagridview控件中的行?

来自分类Dev

为什么不清除我的div?(JavaScript和Jquery)

来自分类Dev

为什么我不能清除background属性(WPF控件)

来自分类Dev

为什么我不能使用javascript清除输入字段?

来自分类Dev

为什么我的弧线宽度没有清除?

来自分类Dev

为什么我的图像在清除后不重绘?

来自分类Dev

我无法清除间隔

来自分类Dev

即使我清除它也会运行SetInterval

来自分类Dev

为什么我的清除按钮仅在验证为真时清除文本框?

来自分类Dev

为什么“清除”不清除整个屏幕?

来自分类Dev

为什么我的宏变量无法解析?

来自分类Dev

为什么我无法设置minSdkVersion

Related 相关文章

  1. 1

    为什么我无法清除setInterval?

  2. 2

    反应为什么我的clearInterval无法停止setInterval?

  3. 3

    为什么我无法控制 setinterval 和 clearinterval javascript?

  4. 4

    为什么setInterval无法正常工作?

  5. 5

    了解为什么git-filter-branch无法清除我的历史记录

  6. 6

    为什么我的显示器无法在backgroud桌面上清除?

  7. 7

    为什么清除不清除?

  8. 8

    为什么setInterval(-> ...),0无法按预期运行?

  9. 9

    为什么我的setInterval函数仅被调用一次?

  10. 10

    为什么python无法确定根并使用标记清除?

  11. 11

    谁能解释为什么内容无法清除?

  12. 12

    为什么我不能使用javascript清除输入字段?

  13. 13

    为什么我不能清除datagridview控件中的行?

  14. 14

    为什么在重用之前我需要清除stringstream?

  15. 15

    我返回时为什么清除了bool out变量?

  16. 16

    为什么我不能在GWTP的UiBinder中清除FlexTable?

  17. 17

    为什么我不能清除ArrayList的两个子列表

  18. 18

    为什么我不能清除datagridview控件中的行?

  19. 19

    为什么不清除我的div?(JavaScript和Jquery)

  20. 20

    为什么我不能清除background属性(WPF控件)

  21. 21

    为什么我不能使用javascript清除输入字段?

  22. 22

    为什么我的弧线宽度没有清除?

  23. 23

    为什么我的图像在清除后不重绘?

  24. 24

    我无法清除间隔

  25. 25

    即使我清除它也会运行SetInterval

  26. 26

    为什么我的清除按钮仅在验证为真时清除文本框?

  27. 27

    为什么“清除”不清除整个屏幕?

  28. 28

    为什么我的宏变量无法解析?

  29. 29

    为什么我无法设置minSdkVersion

热门标签

归档