Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs react redux中的计时器:跟踪滴答声的操作,或只是启动/停止_Reactjs_Timer_Redux - Fatal编程技术网

Reactjs react redux中的计时器:跟踪滴答声的操作,或只是启动/停止

Reactjs react redux中的计时器:跟踪滴答声的操作,或只是启动/停止,reactjs,timer,redux,Reactjs,Timer,Redux,我一直在研究react redux中计时器的实现。似乎有两个小学的思想流派 仅对停止/启动/重置使用操作 在这篇文章中解释() 对秒表的每个滴答声也使用一个动作 我在这本书里读到过。似乎连丹·阿布拉莫夫都对这件事发表了评论。那么也许可以证明这种方法 这方面有最佳实践吗?还是视情况而定?我正在为我的应用程序制作一个计时器,用于跟踪特定任务的时间长度,我只想第一次以正确的方式实现它。我最初的想法倾向于选项1。在很多情况下,“勾选”的想法根本不起作用: 如果在页面关闭时计时器需要保持运行,或 如果

我一直在研究react redux中计时器的实现。似乎有两个小学的思想流派

仅对停止/启动/重置使用操作 在这篇文章中解释()

对秒表的每个滴答声也使用一个动作 我在这本书里读到过。似乎连丹·阿布拉莫夫都对这件事发表了评论。那么也许可以证明这种方法



这方面有最佳实践吗?还是视情况而定?我正在为我的应用程序制作一个计时器,用于跟踪特定任务的时间长度,我只想第一次以正确的方式实现它。我最初的想法倾向于选项1。

在很多情况下,“勾选”的想法根本不起作用:

  • 如果在页面关闭时计时器需要保持运行,或
  • 如果用户使用的设备速度较慢,或者他们的计算机冻结,计时器可能会随着滴答声事件的延迟或跳过而“漂移”
对于您的Redux状态,更好的解决方案可能是:

tasks: [
    { id: '6d5d9f59-a65c-44ad-bf76-b69ef89b4f58',
      title: 'Task One',
      startTime: 1482160636032 },
    { id: '25a502e9-f2ef-4f65-bba6-723cc755c708',
      title: 'Task One',
      startTime: 1482160697663 }
]
使用此函数,您只需减去
Date.now()-task.startTime
即可获得经过的时间

然后,对于计时器,我将每秒重新计算React组件:

class Task extends Component {
    componentDidMount () { tick () }
    componentWillUnmount () { clearTimeout (timer) }
    tick () {
        // time until next second
        // won't drift with time
        const nextSecond = 1000 - Date.now () % 1000
        this.timer = setTimeout (tick, nextSecond)

        this.setState ({ elapsedTime: Date.now () - this.props.task.startTime })
    }
    render () { ...  }
}