gpt4 book ai didi

javascript - 为什么 useEffect 没有被触发?

转载 作者:行者123 更新时间:2023-12-03 06:56:30 25 4
gpt4 key购买 nike

我有一个应该是运行时钟的功能组件:

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;
}

最佳答案

问题是使用 setTimeout以及使用低延迟,即 500ms超时。如果记录 parseTime 的返回值,您会注意到在两次调用之间,它返回相同的时间字符串,因此状态永远不会更新,导致组件永远不会重新渲染,因此 useEffect永远不会再次执行来设置另一个 setTimeout .
解决方案
增加超时延迟或检查parseTime的返回值函数,如果与状态相同,则再次调用该函数。
而且,它更适合使用setInterval这里而不是 setTimeout因为setInterval只需调用一次,它将调用 tick重复运行直到间隔被取消。如果您使用 setTimeout ,那么您需要调用setTimeout一次又一次地安排一个新的tick函数调用。

关于javascript - 为什么 useEffect 没有被触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64663425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com