首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的React简单计数器不像预期的那样工作

我的React简单计数器不像预期的那样工作
EN

Stack Overflow用户
提问于 2022-05-17 16:30:42
回答 2查看 57关注 0票数 1

我开始学习React,我想知道为什么我的计数器不能工作:(我的目标是:当您按下按钮时,计数器函数在td中开始“计数”并呈现“计数”状态。我不知道我做错了什么。

代码语言:javascript
复制
import React, { useState } from "react";


function Clock() {
  const customStyle = {
    fontSize: "100px"
  };
  const tdStyle = "px-3 border border-dark border-3 rounded bg-secondary";
  //-------------------------------------------------------------------------
// THIS FUNCTION 
  const [count, setCount] = useState(0);

  function Counter(){
    setCount(count + 1)
    setInterval(Counter, 1000)
  }  
 

  return (
    <div className="rounded border border-dark border-3">
      <table>
        <tr style={customStyle}>
          <td className={tdStyle}>
            <i className="fa-solid fa-clock"></i>
          </td>
          <td className={tdStyle}>0</td>
          <td className={tdStyle}>0</td>
          <td className={tdStyle}>0</td>
          <td className={tdStyle}>0</td>
          <td className={tdStyle}>0</td>
          <td className={tdStyle}>{count}</td>    //here is showed
        </tr>
      </table>
      <button onClick={Counter}>Pulsar</button>    //button
    </div>
  );
}

export default Clock;

这在真正的秒内有效。

代码语言:javascript
复制
function Counter(){
    setCount(new Date().getSeconds())
    setInterval(Counter, 1000)
  }

但这不是我想要的。我想要一个简单的柜台。

此外,如何在这段代码中使用"onLoad“事件?因为当页面被加载时,它开始在页面中计数和呈现它?

提前谢谢你!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-17 17:06:25

首先,您需要将您的setInterval放在useEffect挂钩中,因为您当前每次状态更新时都会创建一个新的间隔(即每秒钟更新一次),这将大大降低应用程序的速度。其次,您应该使用useEffect清理函数来删除每次组件重新呈现时的间隔,以防止重复的间隔创建。最后,考虑到状态依赖于以前的状态快照(即前一个计数值),您应该使用回调更新状态(以确保访问最新的状态快照)。

代码语言:javascript
复制
useEffect(() => {

  function counter(){
    setCount(prevState => prevState + 1)
  }

  let countInterval = setInterval(counter, 1000)

  return () => clearInterval(countInterval)

}, [])

考虑到每次计数更新时都要调用useEffect,您可以(而且可能应该)使用setTimeout而不是setInterval。在这种情况下,不需要清理函数。

票数 1
EN

Stack Overflow用户

发布于 2022-05-17 16:46:24

如果我理解useState是如何正确工作的,我相信您在计数状态中遇到了一些异步问题,这将解释为什么您的“真正秒”示例能够工作。

我建议将setInterval()函数移动到useEffect挂钩。useEffect钩子也将回答您的onLoad问题。

代码语言:javascript
复制
import React, { useState, useEffect } from "react";


function Clock() {
  const customStyle = {
    fontSize: "100px"
  };
  const tdStyle = "px-3 border border-dark border-3 rounded bg-secondary";
  //-------------------------------------------------------------------------
// THIS FUNCTION 
  const [count, setCount] = useState(0);

useEffect(() => {
  setInterval(counter, 1000);
}, []);

  function Counter(){
    setCount(count + 1)
  }  
 

  return (
    <div className="rounded border border-dark border-3">
      <table>
        <tr style={customStyle}>
          <td className={tdStyle}>
            <i className="fa-solid fa-clock"></i>
          </td>
          <td className={tdStyle}>0</td>
          <td className={tdStyle}>0</td>
          <td className={tdStyle}>0</td>
          <td className={tdStyle}>0</td>
          <td className={tdStyle}>0</td>
          <td className={tdStyle}>{count}</td>    //here is showed
        </tr>
      </table>
      <button onClick={Counter}>Pulsar</button>    //button
    </div>
  );
}

export default Clock;

我不是100%的阳性,这将工作的预期,因为我不能测试它在这个时刻,但我相信这是你正在寻找的。下面也是关于useEffect的文档,https://reactjs.org/docs/hooks-effect.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72277660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档