reactjs - 我可以在 React 中使用 onMouseEnter/Out 事件暂停和取消暂停 setInterval 吗?
问题描述
我希望能够在应用程序运行时启动 setInterval,但也可以暂停它,并使用 onMouseEnter 事件重新启动 setInterval。现在,我已经在 componentDidMount 生命周期中隐藏了 sendInterval:
componentDidMount() {
this.timer = setInterval(() => {
this.forward();
}, 4000);
}
我知道这行不通。
我尝试将 setInterval 包装在 if 语句中,当我将鼠标悬停在组件上时会运行该语句,但是当组件挂载时,我没有悬停,因此它不会运行。并且 componentDidMount 只触发一次,所以我不确定如果 componentDidMount 只触发一次,我将如何暂停 setInterval。
我还尝试在 componentDidMount 之外创建一个单独的计时器函数,该函数由 componentDidMount 触发,但我基本上遇到了同样的问题。我觉得这里需要在某个地方使用递归。我不知道我会在哪里调用一个函数,该函数在除了 componentDidMount 之外的任何其他地方启动 setInterval,但是我无法再次访问它。还是我?
解决方案
您可以将 setInterval 计时器代码保留在函数中,并将计时器引用保留在类实例 (this.timer) 中。现在您可以在 componentDidMount、mouseOver 等中调用该函数。该函数必须负责根据条件参数清除/设置计时器。
推荐阅读
- vue.js - mdi-vue 图标显示两次
- spring-batch - Spring Batch 异常记录
- sharepoint - 我有一个强大的应用程序(将数据存储在 sharepoint 中),现在它已准备好上线,但推出的最佳实践是什么
- svg - svg路径的奇怪行为
- bash - 在mac上捕获光标终端位置的Shell脚本会产生额外的字符
- jakarta-ee - Java 8 和 Servlet 4 的 Maven 依赖项是什么?
- c# - 如何将 C# 中的游戏价值基于其从 0 的大小而不是其实际价值?
- mysql - 无法在mysql上创建用户
- wget - 如何在 Linux 中使用 wget 从服务器下载所有文件以及所有子目录?
- java - 为什么 Micronaut 会丢弃客户端 url 配置的主机名之后的所有内容?