【问题标题】:React-- Timer begins counting seconds in the click of a buttonReact-- 计时器在单击按钮时开始计算秒数
【发布时间】:2017-08-09 02:44:37
【问题描述】:

我正在使用 React 构建一个小游戏,我准备在其中包含一个倒数计时器。

有很多教程(包括 React 官方文档中的一篇)关于如何使用 React 创建计时器或倒数计时器。然而,它们都使用componentDidMountcomponentWillUnmount 生命周期方法来设置和分别清除间隔。

这可以正常工作,但计时器会在组件安装时开始计数。我想要一个开始计数 onClick 的计时器。

实现这种行为的适当生命周期方法是什么?我已经尝试过componentWillUpdatecomponentDidUpdate,但没有效果。

我的第一个想法是使用 gameOn 状态属性,以便仅在游戏开启时(即按下开始按钮)激活计时器,但这不起作用,因为(我猜)我将 gameOn 设置为 true,在组件 didMount 之后很久。

我还尝试将这两个方法与 Timer 组件上的适当状态 ({secondsElapsed: 0}) 一起移动,因为 Timer 是一个单独的组件,它通过 props 与其父级通信。这也没有运气。

最后我尝试在我的构造函数上设置this.interval = null;,但这对定时器的运行方式没有区别。

我认为问题的根源在于生命周期方法,因为这些控制何时调用 setInterval 和 clearInterval。所以我的问题是:

我应该使用哪些其他生命周期方法组合来实现我所追求的行为?

任何精通的建议将不胜感激。

如果你能清楚地解释为什么以及何时应该在我的构造函数上声明this.interval = null;,则可以加分。

关于我到目前为止的例子,基本上看“A Stateful Component

【问题讨论】:

  • 您可以随时以任何方式开始间隔,只是不要忘记清除它们。在 React 生命周期中,清理东西的最佳位置是在 componentWillUnmount 期间。为什么?因为您要确保始终清除间隔。
  • 等等,componentDidUpdate 不也是这样吗?
  • 这不是放置它的理想位置,因为组件更新的因素很多。可能您希望它被事件(onClick)或卸载期间触发/清除。

标签: javascript reactjs onclick intervals


【解决方案1】:
componentWillUnmount() {
  clearInterval(this.interval); // Always clean up before unmounting
}

render(){
  <div>
    <button
      onClick={() => { this.interval = setInterval(() => {
        // Do something here e.g. increment the time
        // NOTE: `this` keyword here refers to the component itself
      }, 1000); }}>
      Start
    </button>
  </div>
}

【讨论】:

  • 这里的问题是onClick函数在父组件上,但是说到componentWillUnmount()我想参考Timer组件...我有四个组件(main、start ,动作和计时器)。 main 是 start 的父级, start 是 action 和 timer 的父级。
  • 您能否进一步解释一下您要访问哪些属性、应该从哪里访问以及从哪里访问?
  • 这确实有效。我不知道可以从 onClick 函数中设置 this.interval。应该考虑一下,但是坚持将它与生命周期方法一起使用的教程让我迷失了方向。赞一个!
  • 顺便说一句,您知道使用 this.interval=null 的任何具体原因吗?在构造函数上?一些关于区间属性的一般信息会很好。 (谷歌搜索并没有带来任何帮助)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 2021-03-26
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
相关资源
最近更新 更多