javascript - 通量存储的动态初始化

标签 javascript reactjs flux reactjs-flux

基于 Flux 的系统如何处理未初始化的存储。

出于多种原因,仅在首次请求数据时才初始化存储是有意义的。如果我正在设计 Facebook 个人资料,我不需要加载“ friend ”列表,直到用户单击“ friend ”选项卡。

但是,如果我们已经已经将该数据加载到存储中,可能是由于之前需要数据的不同 React 组件,我们不想向 ActionCreator/API 发送不必要的调用-util(因此不必要地对服务器征税,并通过一直等待 ajax 调用来抵消 reactjs 快速呈现的好处)。

我想出了几个解决方案,但似乎都不是很完美。


  1. 当组件需要数据时,它会调用商店的 Get 方法。如果它没有收到返回的信息(空对象或未定义),它会触发一个操作来检索该数据。

优点: 看起来在 Flux 架构中,我们的 ActionCreator 仅由 React 组件调用。良好的关注点分离。

缺点: 大量的重复代码。 每次 组件想要调用“UsersStore.getFriends()”(或任何其他存储获取方法)时,它必须在调用之后检查返回值,如果为空则调用ActionCreator。对于我们将经常使用的东西,这是很多样板。


  1. 当组件需要数据时,它会调用商店的 Get 方法。 在此 get 方法中,Store 本身会验证响应是否为空。如果是,Store 本身会触发一个操作来检索数据。

优点:非常精简。每次我们请求信息时,我们一定会收到它(即使这意味着等待下一次发送),而无需在组件中添加任何重复代码。

缺点:这看起来像是 Flux 结构的弯曲(或断裂?)。我们正在直接连接我们的 ActionCreator 和我们的商店。


  1. 在每个组件的 componentDidMount 和/或 componentWillReceiveProps Hook 中,包括对 ActionCreator 的调用以初始化该组件所需的任何存储。

优点:在仅由组件发送操作的 Flux 设计中。

缺点:在围绕单一职责的 Flux 设计之外;我们现在公开地让组件承担管理商店初始化的任务。


这些有效的设计模式是否可用于初始化通量存储?我错过了第 4 个更好的选择吗?

帮助!

最佳答案

Facebook 内部至少使用过一次您的选项 2 - 请参阅 https://news.ycombinator.com/item?id=7721292

在我的大型客户端应用程序中,我们使用选项 1。但是,没有任何代码重复。大多数 getter 函数返回一个“MaybeData”实例,其中包括一个包含数据的“数据”字段、它的占位符或当前可用的部分数据。它还包括一个“dataQueries”字段,其中包含使“数据”完整所需的“查询”列表(如果有的话)。通用的 flux wrapper React 组件然后为它返回的任何查询调度一个 Action 。 (通用的 flux wrapper 组件将存储状态映射到 React 组件状态,然后将其作为 props 传递给包装的组件,例如 Facebook Flux 的 Container(https://facebook.github.io/flux/docs/flux-utils.html#content))

store state getter 始终是没有副作用的纯函数(并且通常根据它们实际访问的 store state 部分进行内存,以提高性能 - 有点类似于“reselect”库:https://github.com/reactjs/reselect)。

因此,如果您使用命令式/OO 风格的通量方法进行编程,选项 2 可能更简单且更适合。如果您有更实用的“redux”风格方法 (https://github.com/reactjs/redux),选项 1 可能更适合。

关于javascript - 通量存储的动态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35425843/

相关文章:

javascript - 通过 Javascript 调用 WCF 服务

javascript - 将 redux 状态复制到组件状态是优化 React 应用程序的好方法吗?

java - 我可以运行 2 个 Mono 异步 Reactor Core 吗?

Spring-MVC 与 ReactJS 集成?

javascript - 从 Javascript Date.now 到 PHP 日期

javascript - 为什么每次我单击工具栏按钮时我的 Javascript 都会变得未定义?

javascript - 在 highcharts 样式模式下按父节点着色 TreeMap

javascript - react Jest : TypeError: Cannot read property 'map' of undefined

javascript - Webpack无法在Electron应用程序中从Nodejs打包https

javascript - 链接到动态事件类?