在Flux应用程序中,应该只有一个调度器.所有数据都流经这个中心枢纽.有了一个单例调度器,它就可以管理所有的store .当您需要Store#1自行更新,然后让Store#2根据操作和Store#1的状态自行更新时,这一点变得非常重要.Flux假设这种情况在大型应用程序中是不可能发生的.理想情况下,这种情况不需要发生,如果可能的话,开发人员应该努力避免这种复杂性.但是单例调度器已经准备好在时机成熟时处理它.
store 也是单身人士.它们应该尽可能保持独立和解耦——一个可以从控制器视图查询的自包含宇宙.进入store 的唯一途径是通过它向调度器注册的回调.唯一的出路是通过getter函数.store 还可以在其状态发生更改时发布事件,以便控制器视图可以知道何时使用getter查询新状态.
在你的示例应用程序中,只有一个PostStore
.同一家store 可以管理"页面"(伪页面)上的帖子,该页面更像FB的Newsfeed,帖子出现在不同用户的页面上.它的逻辑域是帖子列表,它可以处理任何帖子列表.当我们从一个伪页面移动到另一个伪页面时,我们希望重新初始化存储的状态以反映新的状态.我们可能还想在localStorage中缓存以前的状态,作为在伪页面之间来回移动的优化,但我倾向于设置一个PageStore
,等待所有其他存储,管理伪页面上所有存储与localStorage的关系,然后更新自己的状态.请注意,这PageStore
不会存储任何关于帖子的信息——这是PostStore
的域.它只需要知道某个特定的伪页面是否被缓存,因为伪页面是它的域.
PostStore
人的方法是initialize()
.此方法将始终清除旧状态,即使这是第一次初始化,然后根据通过操作接收到的数据,通过Dispatcher创建状态.从一个伪页面移动到另一个伪页面可能需要PAGE_UPDATE
操作,这将触发initialize()
的调用.关于从本地缓存检索数据、从服务器检索数据、乐观渲染和XHR错误状态,有一些细节需要解决,但这是总体思路.
如果一个特定的伪页面不需要应用程序中的所有存储,那么除了内存限制之外,我不完全确定是否有任何理由销毁未使用的存储.但store 通常不会消耗大量内存.只需确保删除要销毁的控制器视图中的事件侦听器.这是在React的componentWillUnmount()
方法中完成的.