【发布时间】:2021-02-16 03:57:55
【问题描述】:
我有一个应该是运行时钟的功能组件:
import React,{useState,useEffect} from 'react';
import 'materialize-css/dist/css/materialize.min.css';
import { parseTime } from '../../Utils/utils'
const MainClock = (props) => {
const [timeString, setTimeString] = useState(parseTime(new Date(), true));
function tick(){
console.log("TICK:" + timeString)
setTimeString(parseTime(new Date(), true));
};
useEffect(()=>{console.log("rendered!");setTimeout(tick,500);},[timeString]);
return (
<div>
<h5 className="center-align mainclock">{timeString}</h5>
</div>
);
}
export default MainClock;
但由于某种原因,它只被渲染了两次,控制台输出是:
rendered!
TICK:14:56:21
rendered!
TICK:14:56:22
为什么第二次渲染后没有调用useeffect?
欢迎任何帮助!
编辑:如果有帮助,这是parseTime:
const parseTime = (timeDate, withSeconds=false) =>{
let time = timeDate.getHours()<10 ? `0${timeDate.getHours()}`:`${timeDate.getHours()}`;
time+=":";
time+= timeDate.getMinutes()<10 ? `0${timeDate.getMinutes()}`:`${timeDate.getMinutes()}`;
if(withSeconds){
time+=":";
time+=timeDate.getSeconds()<10 ? `0${timeDate.getSeconds()}`:`${timeDate.getSeconds()}`;
}
return time;
}
【问题讨论】:
-
这里有什么问题吗?我希望“渲染!TICK:...”将每 500 毫秒连续显示一次。
-
@WilliamWang 这就是问题所在。它没有连续显示“rendered!TICK: ...”,但只显示了两次。
-
我检查过,它工作正常。
-
是的,没有 parseTime,我可以看到连续打印
-
啊,我发现了错误,只是尝试更新setTimeout间隔而不是500。
标签: javascript reactjs use-effect react-component use-state