react-router 和 flux - 转换时清除状态

react-router and flux - clearing state while transition

我正在使用具有 flux 架构的 react-router(facebook 的 flux 实现)。

目前在我的系统中,我的路线显示 "chat/:topic"。

当用户进入此组件时,我正在创建对 websocket 服务器的订阅(使用操作创建,在 componentWillMount 上),我正在删除对 componentWillUnmount 的订阅。

当用户移动到另一条路线时,整个工作流程工作正常 - 因为 react-router 正在卸载我的组件。

当我在路线内转换时(从 "chat/games" 到 "chat/tv"),组件未安装,我需要清除组件的状态。

我了解了我可以采取的不同操作,并且在过渡时发送了一个操作"TRANSITION",每个相关商店都会清除它的商店。

在我看来,这种行为 - 是错误的,它耦合了我的商店和我的路由器。

你会如何解决这个问题?这是我应该向 react-router 提出并要求他们在我的路线内卸载的问题吗?

我相信 compomentWillReceiveProps 可能会解决您的问题。这就是 React router 用来传递东西给你的东西。

据我所知,您需要同时使用 componentWillReceiveProps 和 componentDid/WillMount 来捕获初始渲染。

我正焦急地等待 react-router 1.0 的发布(这个周末?),希望有更优雅的方式来做到这一点。

感谢 gaearon (https://github.com/gaearon/),我找到了答案,

使用商店保留所选主题并向消息商店询问消息,在不断变化的情况下,您不应从商店中删除任何内容,除非您需要它来进行表演原因。

在我的应用程序中,我必须删除消息(因为它们是大对象)并清除我的订阅(以减少服务器上的负载)。

为了实现这一点,我找到了三个解决方案:

  1. 使用 componentWillReceiveProps 并检查参数是否已更改,如果参数已更改 - 执行您需要的任何操作以清除存储 - 例如调用 ActionCreator 并重置状态.
  2. 在转换过程中发送一个处理有效负载(在Router.run内),这将告诉所有商店自行清除。
  3. 最后一个解决方案(我使用的)确保我的组件已卸载 - 为什么?清除 componentWillReceiveProps/dispose 上的状态太容易出错,只确保卸载组件会更清楚。

有关如何实现此目的的详细信息:

https://github.com/rackt/react-router/issues/292

https://github.com/rackt/react-router/issues/496#issuecomment-64152941