【问题标题】:Reactjs with Flux: when and where to initialize a Timer utility in a Flux applicationReactjs with Flux:何时何地在 Flux 应用程序中初始化 Timer 实用程序
【发布时间】:2015-02-10 00:35:22
【问题描述】:

我的应用程序中发生了三件不同的事情:

  1. 定时器设置为 10 秒间隔,直到被要求才停止
  2. 一旦计时器重新开始,异步 Api 实用程序模块会触发一个函数来调用 Api。
  3. 我有一个组件(带有随附的 Action 和 Store 模块),它获取 api 数据(具有相同属性的类似项目的列表)并将它们呈现到页面。

我的问题是这样的:

我应该在何时何地初始化计时器,以便我的组件可以在其render() 方法被调用后开始接收数据?


我考虑在返回之前将其放入render 函数中,但这没有意义,因为我需要在收到数据后立即将 api 数据呈现到页面。

我是否错误地构建了这个应用程序?我的 Timer 和/或 Api 实用程序也应该是 React 组件吗?

【问题讨论】:

    标签: reactjs reactjs-flux


    【解决方案1】:

    我确信有几种方法,但这是我的 2 美分:

    假设您有 LogViewer 应用程序,并且您希望每 10 秒获取和显示一次日志。

    • 那么您将拥有一个LogStore 和一个LogViewer 组件。
    • 在LogViewer 组件的componentDidMount 方法中,我会调用LogStore.getLogs()。
    • LogStore.getLogs() 将调用 APIUtils.getLogs() 并设置一个定时器,每 10 秒触发一次,每次触发时调用 APIUtils.getLogs()。设置定时器后LogStore.getLogs()立即返回一个空数组。
    • 空数组由LogViewer 组件渲染(或显示加载栏)。
    • 同时,来自APIUtils.getLogs() 的ajax 调用返回,GET_LOGS_SUCCESS 服务器操作被分派到所有商店。
    • LogStore 保存传入的日志并为LogViewer 组件发出更改事件以再次调用LogStore.getLogs() 函数。
    • 如果在某个时候你想停止计时器,那么在LogViewer 组件中我会有一个停止按钮,单击该按钮会创建GET_LOGS_STOP 动作。
    • 当GET_LOGS_STOP 操作被分派到LogStore 时,它会通过停止计时器来做出反应。

    我认为这会满足您的要求。

    【讨论】:

    • 这真的很有帮助。在异步调用完成之前,我没有想到要返回空数据,以便在 UI 中进行操作。从哪里分派 GET_LOGS_SUCCESS 最合适,因为 APIUtils 自然没有随附的 APIActions 模块?
    • 您可以拥有一个ServerActionCreator(或APIActionCreator)类,并从APIUtils.getLogs() 中的ajax 函数的success 回调中调用ServerActionCreator.receiveGetLogs。然后ServerActionCreator.receiveGetLogs 会将GET_LOGS_SUCCESS 操作分派给调度程序。
    • 再次感谢您的意见;有了它,我就可以轻松地开始这个项目了。
    猜你喜欢
    • 2015-07-08
    • 2015-03-19
    • 2015-08-05
    • 2016-12-03
    • 2016-06-29
    • 2015-11-22
    • 2011-01-26
    • 2015-04-23
    • 2015-04-07
    相关资源
    最近更新 更多