2015-10-27 114 views
1

我是一个初学者的助焊剂模型,但我认为我理解它在高层次:Flux - 如何处理更新同一视图的多个商店?

事件创建者 - >事件 - >发送 - >存储 - >查看和我们周围去!

鉴于flux模型支持多个商店,如果您有一个事件循环指派给2个商店,那么这个循环会更新相同的视图。

如何管理来自该过程的无意闪烁?我还没有完全启用/使用过反应(我假设一个catch所有的答案都会是这个反应处理这个减少这个重要提升的部分),但是从概念上讲这怎么可能在特定实现之外工作。

由于商店更改是在商店中连续应用的,您是否等到所有商店都停止处理调度员,然后单独允许他们单独发起所有更改?即使如此,您仍然会循环并最终发送事件,并且您仍然可能会在UI上重叠更新。

谢谢!

回答

0

你这里有不同的选择:

香草液是利用在您的商店,结构waitFor()功能,并确保最终每个组件只有一个店呢监听。或多或少是这样的: Store waiting for other stores

需要注意的是,你的动作类型和存储结构需要同步:每个动作需要到包含在一个WAITFOR周期中的所有店沟通。图片中的示例将无法触发渲染。最顶层的商店不会听取调度员的操作,而正确的商店会一直等待更新。另外,如果只有一个组件,红线可能会导致类似的死胡同。我处理这个问题的方法是:让所有商店在第一行听所有行动,如果行动无关紧要:发出改变。

另一种选择是将您的数据整合到一个商店。 这不会导致问题消失:您需要处理单个存储内部的依赖关系问题。但它确实带走了许多行动,很多waitFors,以及许多改变排放的麻烦..

0

请记住,该动作是同步处理的 - 所有存储都将发出,控制器视图带有调用setState等堆栈展开和浏览器有机会重新呈现DOM,因此闪烁是不可能的(浏览器不会在正在运行的函数中呈现,因为否则所有DOM操作代码都会导致随机闪烁)。但是,正如你所说,可能会有多个商​​店发布更改,并且多个组件会监听它们,因此最终可能会多次调用“setState”(即使在同一个组件上)。这听起来效率低下,但在大多数情况下并非如此。只要当前动作来自一个来自React的事件(例如,添加到JSX中的组件的事件处理程序),React就会自动将所有对setState的调用分批处理,并仅对DOM进行重新呈现(即,任何所需的DOM更新)一次,立即(和同步)完成处理事件后。有一种情况需要注意 - 如果你从一个React事件处理器以外的东西(比如一个promise.then,一个AJAX回调,setTimeout回调等等)分派一个动作,那么React将不得不重新调用它,呈现每个对该函数中的setState的单个调用,因为它不知道何时执行该操作。您可以通过使用无证批处理渲染功能,避免这种情况(0.14,注意0.13有此不同的API):

ReactDOM.unstable_batchedUpdates(myFunctionThatDispatchesActions); 

另一种可能是使用过的,现成的流量实现其做这行你已。见例如https://github.com/acdlite/redux-batched-updates