Flux 与多个 ajax 请求

Posted

技术标签:

【中文标题】Flux 与多个 ajax 请求【英文标题】:Flux with multiple ajax requests 【发布时间】:2015-06-22 03:00:56 【问题描述】:

我有一个 React 组件,<Profile/>,用于显示当前选择的用户。

componentDidMountcomponentWillUpdate 上,我检查了 Flux 商店中的用户。

如果用户丢失,或者用户存在但其userId 与url 中的userId 不匹配,我将调用Flux 操作getUser(userId)

问题是,由于componentWillUpdate被多次调用,这个调用可能会被多次触发。

我的临时解决方法是跟踪待处理的 ajax 请求,由 userId 键入,如果一个已经在进行中,我不会发出另一个。

不过,这感觉很老套,我想知道这是否是一个常见问题(以及推荐的解决方案),或者我的架构是否需要改进。

【问题讨论】:

【参考方案1】:

您正在尝试做的是应用程序逻辑而不是视图逻辑。因此,最好将您的逻辑移动到操作/存储(请参阅通量架构以了解有关存储的更多信息)并在您获得响应后发出一个事件,该事件将更新视图组件。

【讨论】:

【参考方案2】:

您不应该在componentWillUpdate 中调用 Flux 商店。 componentWillUpdate 用于您在渲染之前需要做的任何准备工作。当 React 调用 componentWillUpdate 时,它已经确定某些东西(props 或 state)已经改变,并且组件应该更新,所以现在不是获取更多数据的时候。

您应该改为调用 componentWillReceiveProps 中的 Flux 存储(假设用户 ID 作为道具传递给组件)。

【讨论】:

有道理,感谢您提供的信息。但是,同样的问题仍然存在。即,componentWillReceiveProps 被调用 > 我请求数据 > 它被再次调用 > 我请求相同的数据 = 无限循环。我认为有一个属性会因 ajax 调用而发生变化(甚至在返回 ajax 之前),触发循环,但我没有看到它。此外,如果您有 2 个不同的组件,它们都需要相同的数据,其中任何一个都能够请求它,那么(理论上)也会存在同样的问题。如果一个组件已经在进行中,它怎么知道不发出相同的请求? componentWillReceiveProps 不会被调用,除非新的用户 ID 作为 prop 传入。您在做什么导致多个重复请求? 我想我刚刚想通了。我传递了...this.props,而不是为组件显式声明一些属性。我的flux 对象因此被传递下来,所以我认为该对象的更改导致了循环。现在我已经删除它了。谢谢! 没关系,不固定。尽管只传递了所需的属性,但该方法被一次又一次地调用。不知道为什么。记录两个属性(props.userprops.creations)不会显示从一个调用到下一个调用的任何变化。 i.imgur.com/n3Jr035.png @AndersEkdahl 这不是真的; React 无法知道 props 或 state 是否已更改,因为您可能拥有具有引用相等但不具有值相等的对象(感谢 javascript)。除非你使用 shouldComponentUpdate(或者像 PureRenderMixin 这样的 mixin),否则 React 必须假设你会重新渲染。

以上是关于Flux 与多个 ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章

在 Flux 中处理 ajax 请求的最佳方式?

登录ajax请求Flux React?

如何在 Flux 架构中处理 ajax 请求响应?

Flux:如何处理多个异步请求

如何测试 React/Flux 组件状态?

当发出多个 ajax 请求时,是不是有一种“好的模式”来跟踪响应与哪些数据一致?