我开始学习React,我想知道为什么我的计数器不工作:(我的目标是:当你按下按钮,计数器功能开始"计数";render "count"州在td。我不知道我做错了什么。
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;
function Counter(){
setCount(new Date().getSeconds())
setInterval(Counter, 1000)
}
但这不是我想要的。我要一个简单的计数器。
另外,如何使用"onLoad"代码中的事件?当页面加载时,它开始计数并在页面中呈现它?
提前感谢!!
首先,你需要把setInterval放在一个useEffect钩子中,因为你现在每次状态更新(即每秒)都会创建一个新的interval,这将大大降低你的应用程序的速度。其次,你应该使用useEffect清理函数在每次组件重新渲染时删除间隔,以防止重复的间隔创建。最后,如果你的状态依赖于之前的状态快照(即之前的计数值),你应该使用回调来更新你的状态(以确保你访问最近的状态快照)
useEffect(() => {
function counter(){
setCount(prevState => prevState + 1)
}
let countInterval = setInterval(counter, 1000)
return () => clearInterval(countInterval)
}, [])
考虑到每次计数更新时调用useEffect,您可以(并且可能应该)使用setTimeout
而不是setInterval
。在这种情况下,您不需要清理函数。
如果我理解useState是如何正确工作的,我相信你在计数状态中遇到了一些异步问题,这就解释了为什么你的" real seconds ";作品例子。
我建议将setInterval()
函数移动到useEffect
钩子。useEffect
钩子也将是你的onLoad
问题的答案。
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