Flux-无限滚动:我想不出如何坚持单向数据流

Flux- infinite scroll: i cannot think of how to stick to unidirectional data flow

我正在尝试从我从服务器获得的许多项目中实现无限滚动,但我找不到任何适当的方法来保持通量架构设计规则。

想法是:在第一次加载时,我从服务器获取完整的项目列表(只有 id),然后使用 ajax 我每次获取 20 个以上的项目。

列表保存在商店中,加载的项目也是如此。视图监听加载的项目并渲染它们,当它到达滚动底部时它调用一个动作,然后应该再获取 20 个项目,依此类推。

问题是:Action应该知道要取什么items,unloaded items list在store里面,所以它必须直接从store中获取,也就是不断变化的“不要这样做”。其他替代方案是处理商店中的所有逻辑,这似乎也是一个坏主意..

谁能想到一个好的解决方案?

更新:在单向流中,组件可以直接从商店读取(见下文)

让您的操作明确说明要获取哪些项目:"Give me items 21-40 please"。 这将触发 a)(异步)ajax 调用以获取项目 21-40 和 b) 发送到商店。 该组件知道 a) 它已经呈现了哪些项目,以及 b) 用户接下来想看到哪些项目,因此它可以传递上述操作消息而无需再次与商店对话。

商店收到请求。商店知道它还没有这些物品。该组件还不知道。 Store 发出变化,你的组件(假设它正在监听 store 变化)从 store 获取当前状态。如果项目不存在,商店会提供加载状态("loading items 21-40" 或类似)。该组件显示加载状态。 (或者,如果加载的项目已经完全存储,它只呈现项目 21-40)。

一旦 ajax return 交付了商品 21-40,您的商店就会更新商品 21-40 的全部内容。 (如果他们碰巧已经在商店里,没问题,没有更新)。 Store 发出另一个变化。组件听到这个,并重新渲染。

旁白: 单向流用于更新: 组件 -> 下层组件 -> 操作(-> webAPI -> 操作) -> 调度程序 -> 存储 -> 组件

单向流规则为:

  1. 允许组件仅将数据更新推送到低级组件(通过传递触发重新渲染的新道具),而不是更高级别的组件
  2. 允许组件保持内部状态,它们可以将其作为 props 传递给子级(参见 1)
  3. 允许组件将数据更新或更新请求也推送到调度程序(在 "actions" 中)。调度程序然后通过例如 webAPI 将存储 and/or 的更新转发到某个服务器。
  4. 允许组件监听存储更改并直接从存储中拉取/读取数据。

  5. 商店侦听调度员,并在收到来自调度员的消息时更新。

  6. 商店也可以监听其他商店,并从其他商店读取数据以更新自己
  7. Stores 在更新后立即发出变化,这样任何监听的组件都可以做一些事情(通常读取新数据)(见 4.)

  8. 来自服务器的 WebAPI 结果为 "actions"。他们通过调度程序通知相关商店进行更新。 (见5)

单向流中断如果:

  • 组件主动从更高的组件获取/拉取数据 - 此类数据应由更高的组件作为 props 推送(见 1)
  • 组件主动从子组件中获取数据 - 作为父组件,组件应该已经拥有此数据。如果是child's state,说明state设计的水平太低了。
  • 组件直接更新存储 - 应该通过调度程序进行操作

如果(尽管有些人不同意)也会中断:

  • Store 直接更新另一个 store - 应该是 pull 而不是 push(见 6)
  • 商店通过操作推送更新 - 仅允许 webAPI(参见 8)和组件(参见 3)发出操作
  • 组件直接执行 webAPI 请求并处理状态中的结果 - 应该通过调度程序