Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么useEffect没有被触发?

为什么useEffect没有被触发?
EN

Stack Overflow用户
提问于 2020-11-03 13:06:24
回答 2查看 100关注 0票数 4

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;

但由于某些原因,它只渲染了两次,控制台输出为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rendered!
TICK:14:56:21
rendered!
TICK:14:56:22

为什么useeffect在第二次渲染后没有被调用?

欢迎任何帮助!

编辑:如果有帮助,这是parseTime

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-03 13:13:11

问题是使用setTimeout和使用低延迟,即用于超时的500ms。如果记录parseTime的返回值,您将注意到在两次调用之间,它返回相同的时间字符串,因此状态永远不会更新,从而导致组件永远不会重新呈现,因此useEffect永远不会再次执行以设置另一个setTimeout

解决方案

增加超时延迟或检查parseTime函数的返回值,如果与状态中的返回值相同,则再次调用此函数。

此外,在这里使用setInterval比使用setTimeout更合适,因为setInterval只需要调用一次,它将重复调用tick函数,直到取消间隔。如果使用setTimeout,则需要一次又一次地调用setTimeout来安排新的tick函数调用。

票数 4
EN

Stack Overflow用户

发布于 2020-11-03 13:54:30

如上所述,这是短setTimeout计时值- 500ms的问题。要使其正常工作,您需要使用setInterval

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const MainClock = (props) => {
    const [timeString, setTimeString] = useState(parseTime(new Date(), true));
    function tick(){
        console.log("TICK:" + timeString)
        setTimeString(parseTime(new Date(), true));
    };

    useEffect(() => {
      setInterval(tick, 500);
    }, []);
    useEffect(()=>{console.log("rendered!");},[timeString]);
    return (
        <div>
            <h5 className="center-align mainclock">{timeString}</h5>
        </div>        
    );
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64663425

复制
相关文章
zabbix远程执行shell脚本没有被触发执行
今天处理一个zabbix收到磁盘容量不足的报警时,远程到agent执行脚本的问题。
肓己
2021/08/12
1.2K0
为什么OpenFlow没有被广泛采用?
可操作性与可扩展性问题 OpenFlow的终端用户以及市场人员明确指出其技术问题:操作复杂,很难测试以及扩展。 这不是OpenFlow的核心技术问题,但确是其生态系统中很重要的一部分,像与芯片厂商以
SDNLAB
2018/03/30
1.3K0
为什么OpenFlow没有被广泛采用?
作为现代开发的基础,为什么 TDD 没有被广泛采用?
作者 | Buttondown 译者 | Sambodhi 策划 | Tina 测试驱动开发 在 1999 年左右是最前沿的技术,也是现代开发的基础,但为什么直到现在还没有被广泛使用?   “我认为,在我作为一名专业极客的四十二年生涯中,软件行业在历史上始终不能或不愿意掌握和采用测试驱动开发(TDD),这是最令人沮丧和丧气的事件之一。”对于 TDD 没有广泛被应用的问题,GeePaw Hill 发了系列 推文 进行了探讨。他认为问题在于其支持者在组织方面的失败,他们推动得太猛,想将“TDD”转化
深度学习与Python
2023/03/29
5290
作为现代开发的基础,为什么 TDD 没有被广泛采用?
为什么不能直接在 useEffect 中使用 async
在代码中,我们会使用 async/await 从第三方 API 获取数据。如果你对 async/await 熟悉的话,你会知道,每个 async 函数都会默认返回一个隐式的 promise。但是,useEffect 不应该返回任何内容。所以你会在控制台日志中看到以下警告:
小鑫
2022/04/22
2.6K0
【DB笔试面试565】在Oracle中,为什么索引没有被使用?
“为什么索引没有被使用”是一个涉及面较广的问题。有多种原因会导致索引不能被使用。首要的原因就是统计信息不准,第二原因就是索引的选择度不高,使用索引比使用全表扫描效率更差。还有一个比较常见的原因,就是对索引列进行了函数、算术运算或其他表达式等操作,或出现隐式类型转换,导致无法使用索引。还有很多其它原因会导致不能使用索引,这个问题在MOS(MOS即My Oracle Support)“文档1549181.1为何在查询中索引未被使用”中有非常详细的解释,作者已经将相关内容发布到BLOG(http://blog.itpub.net/26736162/viewspace-2113670/)上了。下面是一些非常有用的检查项目。
AiDBA宝典
2019/09/29
1.2K0
【DB笔试面试565】在Oracle中,为什么索引没有被使用?
为什么 Java 线程没有 Running 状态?一下被问懵!
Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。
java进阶架构师
2021/07/08
4520
为什么 Java 线程没有 Running 状态?一下被问懵!
为什么没有运营的SaaS没有未来?
来源:大虫运营心经  作者 : 花大虫 ---- 职业生涯前几年一直在做C端互联网相关的工作,这两年突然转做B端了,感受有很大的差异,但是却又有很大的相似性,To C的运营经验对To B的运营有巨大的帮助。越做越觉得To B行业有意思,大有可为。 最近我会把近2年亲身经历的一些To B行业运营经验分享给大家。 万信是我现在创业在做的一家餐饮SaaS公司,后面文章中会有涉及。 ✎✎✎ 大家谈To B都会讲产品、讲销售,很少人会讲到运营。殊不知一个To B产品的运营非常关键,因为这直接决定了一个非常重要
腾讯SaaS加速器
2020/06/09
9520
为什么Hook没有ErrorBoundary?
在很多全面使用Hooks开发的团队,唯一使用ClassComponent的场景就是「使用ClassComponent创建ErrorBoundary」。
公众号@魔术师卡颂
2022/11/22
1.4K0
onbeforeunload事件被a链接触发的问题
onbeforeunload本身并非W3C DOM-Event标准事件,只不过在很多时候国内的流氓做法就是离开页面,直接弹出收藏本网页的提示(虽然我很讨厌这种做法,但事实上很多公司一直都在这样默默地强奸用户…)
meteoric
2018/11/16
1.9K0
早读《A Complete Guide to useEffect》
https://overreacted.io/a-complete-guide-to-useeffect/
icepy
2019/12/18
7710
“愚蠢”的useEffect
我有一个需求,需要监听一个window.xxx的变动,并在它变动的时候更新view。
爱吃大橘
2022/12/27
3090
useEffect与useLayoutEffect
useEffect与useLayoutEffect可以统称为Effect Hook,Effect Hook可以在函数组件中执行副作用操作,副作用是指函数或者表达式的行为依赖于外部环境,或者在这里可以理解为修改了某状态会对其他的状态造成影响,这个影响就是副作用,数据获取,设置订阅以及手动更改React组件中的DOM都属于副作用。
WindRunnerMax
2022/05/06
1.2K0
数组越界为什么没有出错
数组越界 在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 那什么是数组? 首先,我们应该知道数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。(下标通常从0开始算起:0、1、2、…n。) 组成数组的各个变量称为数组的
编程范 源代码公司
2018/04/18
2.1K0
数组越界为什么没有出错
为什么没有IPv5?
曾经我也想过ipv5去哪了… 所有文档都表示,ipv5被视为一个内部项目而没有广泛使用。我们都被骗了。经过我的努力调查发现,ipv5事实上是一个真实存在的秘密项目……只不过很多人对其不了解。 ip
福贵
2018/04/12
2.7K0
为什么没有IPv5?
为什么Python没有main函数?
众所周知,Python中没有所谓的main函数,但是网上经常有文章提到“ Python的main函数”和“建议编写main函数”。
AI科技大本营
2020/07/24
1.8K0
linux为什么没有病毒
linux不是没有病毒,而是病毒少。病毒少的原因:1、Linux账号有限制,即使这个病毒成功地感染了这个用户拥有的一个程序,由于这个用户权限受限,它进一步传播的任务也会非常困难;2、Linux网络有限制,其网络程序构建地很保守,没有让病毒快速传播变的可能的高级宏工具;3、Linux的应用软件和系统软件几乎都是开源的,而病毒很难藏身于开源的代码中间。 Linux教学 本教程操作环境:linux7.3系统、Dell G3电脑。 linux不是没有病毒,而是病毒少。 那么为什么Linux系统下病毒这么少?很
很酷的站长
2022/11/30
5K0
linux为什么没有病毒
git -modified: xxx目录没有被跟踪
删除该目录下的.git目录,一般是隐藏状态,注意让他显形[ 删除git中的code-demo,删除之后重新添加 git rm -r --cached code-demo git add code-de
JavaEdge
2021/02/22
5580
git -modified: xxx目录没有被跟踪
IP为什么被Locked?
在Vivado下使用IP时,有时会发现IP处于被Locked的状态,如下图所示。这个报告是由命令report_ip_status生成。可以看到,一旦IP被锁定,那么在IP名字上会出现一个红色锁子的标记。
Lauren的FPGA
2020/07/23
2.8K0
手写useState与useEffect
useState与useEffect是驱动React hooks运行的基础,useState用于管理状态,useEffect用以处理副作用,通过手写简单的useState与useEffect来理解其运行原理。
WindRunnerMax
2022/05/06
2K0
点击加载更多

相似问题

useEffect没有被触发

12

React当属性更改时,为什么useEffect没有被触发

26

useEffect没有被调用

14

为什么onEdit没有被触发?

13

为什么它没有被触发?

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文