考虑一个多页面应用程序,当你打开一个页面时,它会启动一个计时器,负责每隔n秒进行一次数据处理。现在考虑你想要转到另一个页面,你如何保证定时器将被停止(因为在第二页上不需要它)。
我会按以下方式实现它:
App.jsx
onClickNavigateToPageA: function() { AppActions.goToA(); }
AppActions.js
goToA: function() {
DispatchActionToLoadComponentPageA();
DispatchActionToStartTimer();
}
现在我点击进入第B页。如何告诉计时器停止?如果我在componentWillUnmount上执行此操作(通过操作,我相信),我将在操作期间调度操作(加载页面B的操作),所以这是错误的。
正确的方法是在加载页面A之后立即注册一个回调(可以调用一个动作来禁用计时器),然后在加载任何其他页面时调用它?据我所知,商店现在永远不应该关于用于从服务器获取数据的api(包括计时器,它应该是动作创建者)。
答案 0 :(得分:2)
您可以使用所需的任何JSON有效内容调度操作,这意味着您可以按调度操作本身的属性对操作类型进行分组。在这种情况下,来自DispatchActionToLoadComponentPageA
的有效负载可能是:
{
type: 'pageLoad',
page: 'pageA'
}
与您可能发布的其他类型的操作不同:
{
type: 'xhrComplete',
response: ...
}
现在,您的计时器可以侦听pageLoad
类型的操作,并根据加载的页面是否需要计时器来启动/停止。
答案 1 :(得分:1)
如果您不使用计时器和商店,我将不会使用动作和通量循环。如果它与商店有关,则使用通量循环。 无论如何,我只会使用一个普通的"计时器"具有所需功能的模块,并在需要时打开/关闭。