我正试图让我的网络应用程序显示一个消息的时间设置每当按钮被按下,并为所述计时器重置每当按钮被按下之前的时间已经过去了。我甚至觉得问这个问题很愚蠢,但是我如何使启动计时器的按钮在再次单击按钮时也重置它呢?下面是我目前的代码:
import { useState, useEffect } from "react";
export default function App() {
const [revealed, isRevealed] = useState(false);
const [time, setTime] = useState(0);
useEffect(() => {
let timer;
if (revealed) {
clearTimeout(timer);
setTime(2500);
timer = setTimeout(() => isRevealed(false), time);
}
}, [revealed]);
return (
<div>
<button onClick={() => isRevealed(true)}>Start!</button>
{revealed ? (
<p>
This should stay showing up if you keep clicking on the "Start!"
button.
</p>
) : null}
</div>
);
}
下面是我的代码的CodeSandbox演示:https://codesandbox.io/s/frosty-worker-g9l986?file=/src/App.js
2条答案
按热度按时间lp0sw83n1#
你设置revealed*“true”* 当按钮被点击时,当revealed**为true时,点击按钮不做任何事情。我建议的解决方案是,设置状态的方式是每次点击按钮都可以改变它。例如使用点击的时间按钮。要清除超时,应该使用useEffect return。
import { useState,useEffect } from“react”;
ygya80vv2#
简短回答:
clearTimeout()
https://developer.mozilla.org/en-US/docs/Web/API/clearTimeout长回答:
将
timer
移动到全局作用域,这样就可以用来清除超时并重新使用它。另外,超时的触发应该在
onClick
处理程序中,而不是在useEffect
中。所以按钮应该是看你的代码在行动:https://codesandbox.io/s/dazzling-almeida-xpm449?file=/src/App.js