我正在try 编写一个有两个按钮的简单计时器. 开始按钮:计时器将每10ms增加一个. 按下按钮:计时器将被推到一个数组中,并显示在前标签中. 不幸的是,Lap Button不起作用. 有人能帮我解决这个问题吗? 泰.

import { useState } from "react";
import { formatSeconds } from "./format";
let interval : NodeJS.Timer;

function App() {
  const [buttonName, setButtonName] = useState("Start");
  let [timer, setTimer] = useState(0);
  const laps : Array<number> = [];

  const handleStartClick = () => {
    setButtonName(buttonName === "Start" ? "Stop" : "Start")

    if(buttonName === "Start"){
      interval = setInterval(() => {
        setTimer(timer += 1)
      }, 10);
    }else{
      clearInterval(interval)
    }
    
  }

  const handleLapClick = () => {
    laps.push(timer);
  }

  return (
    <div>
      <button onClick={handleStartClick}>{buttonName}</button>
      <button onClick={handleLapClick}>Lap</button>
      <div>
        <p>Elapsed:</p> <pre id="elapsed">{formatSeconds(timer)}</pre>
      </div>
      <hr />
      <div id="laps">
        <p>Laps:</p>
        {laps?.map((item) => {
          return <pre key={item}>{formatSeconds(item)}</pre>;
        })}
      </div>
    </div>
  );
}

export default App;

   

推荐答案

101:您的组件未在handleLapClick函数上更新.

100

  • 使用useState hooklaps更改为state变量
  • 不是将值推入laps array,而是通过创建包含当前计时器值的new array来更新laps state.

(创建一个新数组,然后更新LAPS状态的原因是因为一个名为state immutability in Reaction的概念)

100

const [laps, setLaps] = useState<number[]>([]);
const handleLapClick = () => {
    setLaps((prevLaps) => [...prevLaps, timer]);
  };

100

import { useState } from "react";
import { formatSeconds } from "./format";

let interval: NodeJS.Timer;

function App() {
  const [buttonName, setButtonName] = useState("Start");
  const [timer, setTimer] = useState(0);
  const [laps, setLaps] = useState<number[]>([]);

  const handleStartClick = () => {
    setButtonName((prevButtonName) =>
      prevButtonName === "Start" ? "Stop" : "Start"
    );

    if (buttonName === "Start") {
      interval = setInterval(() => {
        setTimer((prevTimer) => prevTimer + 1);
      }, 10);
    } else {
      clearInterval(interval);
    }
  };

  const handleLapClick = () => {
    setLaps((prevLaps) => [...prevLaps, timer]);
  };

  return (
    <div>
      <button onClick={handleStartClick}>{buttonName}</button>
      <button onClick={handleLapClick}>Lap</button>
      <div>
        <p>Elapsed:</p> <pre id="elapsed">{formatSeconds(timer)}</pre>
      </div>
      <hr />
      <div id="laps">
        <p>Laps:</p>
        {laps.map((item, index) => (
          <pre key={index}>{formatSeconds(item)}</pre>
        ))}
      </div>
    </div>
  );
}

export default App;

Reactjs相关问答推荐

在一个地方调用函数会影响其他地方调用该函数

For循环中的元素在Reaction中丢失挂钩

可选链和useState挂钩

try 在Dockerfile中使用AWS CLI将React构建工件上传到S3时出错

使用useReducer时,props 未从父级传递给子或孙级

单击空白区域时,Reaction Multiple下拉组件不关闭

每次单击按钮时,Reaction组件都会重新生成

如何使图像zoom 并移动到点击点

更改滑块标记的文本 colored颜色 ./Reaction/MUI 5

Reaction-路由-DOM v6与v5

为什么我的react 简单计时器项目不起作用?

如何优化 React 应用程序的性能?

臭名昭著的测试未包含在 act(...) 中

当 React 中的状态发生变化时如何停止重新加载谷歌 map ?

Redux Toolkit 配置,是否适用于全栈应用程序?

意外的标记.您可能需要一个合适的加载器来处理这种文件类型.书?.img? /*#__PURE__*/React.createElement("img",

react-markdown 不渲染 Markdown

如何使用 babel 将 SVG 转换为 React 组件?

axios post方法中的请求失败,状态码为500错误

在 redux 状态更改时更新react 按钮禁用状态