javascript - 挂钩中 1 分钟计数器的重置无法正常工作
问题描述
我正在创建 1 分钟计数器并且它正在工作,但是当我单击重置按钮重新启动同一个计数器时,会出现奇怪的行为。
这是代码
export default function App() {
const [counter, setCounter] = useState(60);
useEffect(() => {
counter > 0 && setTimeout(() => setCounter(counter - 1), 1000);
}, [counter]);
const handleReset = () => {
setCounter(60);
}
return (
<div className="App">
<h1>Counter</h1>
<p>{counter}</p>
<button onClick={handleReset}>Reset</button>
</div>
);
}
有人可以帮我改进吗?谢谢
解决方案
考虑useEffect
使用一个空的依赖数组和一个间隔而不是超时。然后,在超时回调中,counter
如果大于 0,则递减:
const App = () => {
const [counter, setCounter] = React.useState(60);
React.useEffect(() => {
setInterval(() => {
// Must use callback form here; outer `counter` is in stale closure
setCounter(counter => counter === 0 ? counter : counter - 1);
}, 1000);
}, []);
const handleReset = () => {
setCounter(60);
}
return (
<div className="App">
<h1>Counter</h1>
<p>{counter}</p>
<button onClick={handleReset}>Reset</button>
</div>
);
}
ReactDOM.render(<App />, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class="react"></div>
您当前使用[counter]
依赖数组的实现意味着每次counter
更改时都会设置一个新的递归超时,这是不可取的;您将同时运行多个递归超时。
推荐阅读
- javascript - 使用带有功能组件的 react-codemirror2
- linux - 带有“read”的“-r”标志是否会导致字符转义?
- bootstrap-4 - 如何使用 Bootstrap 4 将水平表单与提交按钮对齐?
- windows - 带有 NoBuffering 的 Haskell 跨平台 getChar
- azure - 在 Azure cosmosDB 帐户中禁用低于 1.2 的 TLS
- azure-devops - Azure DevOps - 具有多个看板的多个项目与具有多个存储库的单个项目
- java - Javafx:将 ImageView 绑定到 Anchorpane 或 VBox 并通过调整场景大小来缩放 ImageView
- r - 有效地为每一行在不同的 DataFrame 中找到值
- reactjs - 如何为 Facebook 和 Google 登录创建 AWS Cognito 用户池
- angular - 我的应用程序可以使用 Selenium 自动化吗?