当前位置: 首页 > 面试题库 >

使用React钩子实现一个自增计数器[重复]

华心思
2023-03-14
问题内容

代码在这里:https :
//codesandbox.io/s/nw4jym4n0

export default ({ name }: Props) => {
  const [counter, setCounter] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      setCounter(counter + 1);
    }, 1000);

    return () => {
      clearInterval(interval);
    };
  });

  return <h1>{counter}</h1>;
};

问题在于每个setCounter触发器都会重新渲染,因此间隔会重置并重新创建。由于state(counter)不断增加,因此这看起来不错,但是与其他钩子结合使用时可能冻结。

正确的方法是什么?在类组件中,使用持有间隔的实例变量很简单。


问题答案:

您想给一个空数组作为第二个参数,useEffect以便该函数在初始渲染后仅运行一次。

由于闭包的工作方式,这将使counter变量始终引用初始值。您可以改用函数版本setCounter来始终获取正确的值。

const { useState, useEffect } = React;



function App() {

  const [counter, setCounter] = useState(0);



  useEffect(() => {

    const interval = setInterval(() => {

      setCounter(counter => counter + 1);

    }, 1000);



    return () => {

      clearInterval(interval);

    };

  }, []);



  return <h1>{counter}</h1>;

};



ReactDOM.render(

  <App />,

  document.getElementById('root')

);


<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>

<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>



<div id="root"></div>


 类似资料:
  • 我有一个组件,我在其中调用我的自定义钩子。 自定义钩子如下所示: 而我在其中使用的导致错误的组件是: 有什么想法吗?

  • 一个组件,它呈现已填好的表单的预览,当您单击左侧的表单时,它会在右侧显示它们。 第一个handleSwitchReview向我抛出了React钩子,所呈现的钩子比上一个呈现错误时要多 第二个不是。当我控制台日志道具,例如,我得到他们4-5次时,第一个函数的视图显示,但没有第二次,第二次只显示1次在控制台日志。 尝试移动setState并在控制台中记录父组件,但这个组件是唯一一个启动了很多次并中断的

  • 本文向大家介绍利用yarn实现一个webpack+react种子,包括了利用yarn实现一个webpack+react种子的使用技巧和注意事项,需要的朋友参考一下 一、初始化项目 首先确保你的node 版本 >=4.0.并且确保yarn可以正常工作,关于安装yarn,你可以看这里 我们先创建个空文件夹 比如yarn-react-webpack-seed,然后输入命令: yarn 如果没有安装,全程

  • 问题内容: React Hooks useState 可以将本地状态附加到无状态功能组件,例如 我想知道执行上面两行后的本地状态对象树是什么样子? 胡克规则说了一些关于状态如何处理的事情 React依赖于Hook的调用顺序 还是局部状态根本不是对象树,而只是一个数组? 提前致谢! 问题答案: 挂钩在内部实现为队列,每个挂钩由引用下一个的节点表示。 从文档中: 每个组件都有一个内部的“内存单元”列表

  • 但我的问题是我如何强制上面的功能组件重新呈现立即与钩子?

  • 我发现自己处于一种奇怪的境地。我正在实现一个钩子,我无法实现我想要的。 我有这样的想法: 我的问题是函数setFoo正确执行,所以foo state是一个新的数组,但是setBar依赖于foo的状态,接收一个空数组。基本上setBar是在setFoo完成之前执行的,所以getBar函数接收一个空数组。 管理这种依赖的正确方法是什么? 谢谢F