Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有问题的反应,创建一个时钟,可以手动改变时间。

有问题的反应,创建一个时钟,可以手动改变时间。
EN

Stack Overflow用户
提问于 2020-12-04 00:53:34
回答 1查看 256关注 0票数 1

我正在尝试创建一个时钟,它将每秒钟运行一次,但也允许用户单击按钮将时钟向前移动一小时。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    const addTime = (date, time) => new Date(date.getTime() + time)
    
    const Clock = () => {
        const [timeDate, setTimeDate] = useState(addTime(new Date(), SECOND_IN_MS));

        const updateTimeInfo = (addedTime) => {
            setTimeDate(addTime(timeDate, addedTime);
            //other info omitted, won't affect the code
        }

        useEffect(() => {
            let tickClock = setInterval(() => {
               updateTimeInfo(SECOND_IN_MS)
            }, SECOND_IN_MS);

            return () => clearInterval(tickClock);
        }, [timeDate])
    
      
        return (
            <span>{timeDate.toLocaleTimeString([], { hour: '2-digit', hour12: true, minute: '2-digit' });</span>
            <button type="button" onClick={() => updateTimeInfo(HOUR_IN_MS)}>{"Add 1 hour"}</button>
        )
    }

现在的问题是,每当我将时钟更新为新的时间时,就会触发useEffect,并且时钟将重新建立每秒钟更新一次的间隔,导致时钟在1秒过去之前不会更新秒。

我希望时钟总是滴答1秒,但也允许用户同时快速前进1小时。

有可能让这一切成为可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-04 01:27:37

timeDate钩子中删除useEffect依赖项,并在updateTimeInfo中使用功能状态更新

  1. 安装间隔一次,当组件挂载时,将清除函数返回到清除间隔。 useEffect () => { const tickClock = setInterval(() => { updateTimeInfo(SECOND_IN_MS);},SECOND_IN_MS);返回() => clearInterval(tickClock);},[];
  2. 功能状态更新允许每个排队的timeDate状态更新从前一个状态正确更新。 const updateTimeInfo = (addedTime) => { setTimeDate((timeDate) => addTime(timeDate,addedTime));//其他省略的信息,不会影响代码};

它的工作原理:

间隔每秒运行一次updateTimeInfo。该按钮也只是以异步方式调用updateTimeInfo,即每当单击+1小时按钮时。这两者应该是相互独立的。

如果没有函数状态更新,那么只有初始的timeDate状态值在效果上被关闭,而时间只会从初始状态值每次更新一次。

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const SECOND_IN_MS = 1000;
const HOUR_IN_MS = 1000 * 60 * 60;

const addTime = (date, time) => new Date(date.getTime() + time);

const Clock = () => {
  const [timeDate, setTimeDate] = useState(addTime(new Date(), SECOND_IN_MS));

  const updateTimeInfo = (addedTime) => {
    setTimeDate((timeDate) => addTime(timeDate, addedTime));
    //other info omitted, won't affect the code
  };

  useEffect(() => {
    const tickClock = setInterval(() => {
      updateTimeInfo(SECOND_IN_MS);
    }, SECOND_IN_MS);

    return () => clearInterval(tickClock);
  }, []);

  return (
    <>
      <span>
        {timeDate.toLocaleTimeString([], {
          hour: "2-digit",
          hour12: true,
          minute: "2-digit",
          second: "2-digit"
        })}
      </span>
      <button type="button" onClick={() => updateTimeInfo(HOUR_IN_MS)}>
        +1 hour
      </button>
      <button type="button" onClick={() => updateTimeInfo(-HOUR_IN_MS)}>
        -1 hour
      </button>
    </>
  );
};

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65140518

复制
相关文章
time:Python的时间时钟处理
time库运行访问多种类型的时钟,这些时钟用于不同的场景。本篇,将详细讲解time库的应用知识。
luckpunk
2023/09/29
2770
time:Python的时间时钟处理
可以改变的量-变量
变量用来记录数值。使用变量进行代数计算,则该变量中数值可以随着程序的逻辑计算而改变。当计算全部结束后,再将数值拿出展示给用户。
星哥玩云
2022/09/14
3650
可以改变的量-变量
手动创建线程池
我们之所以要手动创建线程池,是因为 JDK 自带的工具类所创建的线程池存在一定的弊端,那究竟存在怎么样的弊端呢?首先来回顾一下 JDK 中线程池框架的继承关系:
用户4283147
2022/10/27
7250
手动创建线程池
RocketMQ手动创建Topic
创建Topic使用的命令 mqadmin updateTopic: .\mqadmin updateTopic Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0 Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in
青山师
2023/05/05
2.2K0
前端|创建简单动态时钟
动态时钟,就是通过CSS工具的美化效果和引入JavaScript,让网页呈现出钟表的动态效果,让它能够记录时间。通过改变背景颜色、指针颜色和阴影效果,让时钟呈现不同的颜色。
算法与编程之美
2020/08/10
1.7K0
前端|创建简单动态时钟
eclipse创建java项目无反应
系统升级到win10,重新安装eclipse,发现设置了原来的工作文件夹后,点击Java Project和Project都没有反应
全栈程序员站长
2022/11/17
1.1K0
eclipse创建java项目无反应
手动创建 SpringBoot Web 应用
1. 快速创建 ---- 官网位置 2. 手动创建过程(以IDEA为例) ---- 1. 创建Maven项目: File -> New -> Project 选择 Maven,然后点击 Next GroupId 一般为域名倒写,ArtifactId 一般为项目名,Version 为版本号,填写完毕之后,点击 Next 选择项目位置,点击 Finish 2. 添加依赖 3. 配置资源目录 File -> Project Structure Module -> Sources 将 src 设置成 Sources
山海散人
2021/03/03
9180
AI可以预测患者对免疫疗法的反应
发表在“The Lancet Oncology”上的一项研究首次证实,AI可以处理医学图像以提取生物学和临床信息。通过设计算法并将其开发用于分析CT扫描图像,Gustave Roussy,CentraleSupélec,Inserm,Paris-Sud University和TheraPanacea(专门从事AI的放射治疗和精密医学)的医学研究人员创建了一个所谓的放射学特征。该特征定义了肿瘤的淋巴细胞浸润水平,并提供了患者免疫治疗功效的预测评分。
AiTechYun
2018/09/26
6400
AI可以预测患者对免疫疗法的反应
Feign-手动创建FeignClient
在Feign-请求不同注册中心的服务中,提到,如果需要请求不同注册中心的服务,可以设置@FeignClient的url属性。
用户2146693
2019/08/08
3.8K0
Feign-手动创建FeignClient
Unity基础系列(一)——创建一个时钟(GameObjects与Scripts)
这篇教程是一个基础教程,会和大家一起创建一个简单的时钟,并且给它加上一些组件脚本用来显示当前时间。这篇教程的意义并不在于怎么学会写出一个时钟,而是教你认识Unity的编辑器。当然如果你之前已经接触过或者用过Unity了并且能自己找到场景窗口,那么就算是有个很好的开始了。
放牛的星星
2020/07/15
2.3K0
Django 创建一个返回当前时间的页面
修改 settings.py 文件, 把上面手动创建的 templates 文件夹路径添加进去
py3study
2020/01/17
9530
手动创建macOS恢复分区
因为某些原因需要制作macOS的恢复盘,但是苹果官方的OS X 恢复磁盘助理早已不支持APFS文件系统。
幻影龙王
2021/09/12
2.5K0
手动创建macOS恢复分区
长时间运行后无法创建session的问题
Jira Ticket: https://jira.mongodb.org/browse/SERVER-42827
MongoDB中文社区
2020/07/22
1.9K0
创建基本时钟周期约束
Xilinx建议把时序约束和物理约束分开来写。(但是必须有一个作为target) 时序约束用于综合和实现,物理约束用于实现。 1时钟周期 2占空比 3相位 Waveform={上升沿时刻,下降沿
瓜大三哥
2018/02/24
1.2K0
创建基本时钟周期约束
世界上最短的时钟代码!更短的,有木有?
该文介绍了如何用 Processing 语言实现时钟的绘制。首先介绍了 Processing 语言的用途,然后给出了一段示例代码,接着详细讲解了时钟绘制代码的实现细节。最后给出了一个在线演示链接,读者可以在线查看该时钟的绘制效果。
IMWeb前端团队
2017/12/29
1.2K0
时钟偏移是如何影响建立时间和保持时间的?
时钟偏移反映了时钟信号到达同一时序路径上的不同寄存器的时钟端口之间的时间差异,如下图所示。时钟clk从源端到达寄存器FF1的时间点为Tclk1,到达寄存器FF2的时间点为Tclk2,故时钟偏移即为Tclk2与Tclk1的差。若clk源端记为零时刻点,那么Tclk1和Tclk2分别对应发送时钟路径延迟和捕获时钟路径延迟。
Lauren的FPGA
2023/08/18
6380
时钟偏移是如何影响建立时间和保持时间的?
世界上最短的时钟代码!更短的,有木有?
Processing.js作者是John Resig,这是继Jquery之后,他的第二个力作。
IMWeb前端团队
2019/12/03
1.5K0
gPTP时钟同步(时间同步)协议简介
• 教官首先发出“齐步—–走”的命令,大家听到“齐步”二字后,开始调整动作,最终所有人实现动作同步。
NTP网络同步时钟
2022/03/09
9.1K1
gPTP时钟同步(时间同步)协议简介
点击加载更多

相似问题

手动编辑时钟时间

114

创建时钟的反应

15

手动设置html/css时钟时间

10

如果时钟的时间改变了,输入将如何随时钟的值而改变?

115

当有手动系统时间改变时,如何停止AlarmManager?

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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