Reactjs 需要在几个减速器中捕捉一个动作。反模式?

Reactjs 需要在几个减速器中捕捉一个动作。反模式?,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我正在重新编写/移植我的大型幻灯片项目,以便React和Redux,这曾经是一个大型jQuery项目,业务逻辑存储在大型类中 我要直接讨论我的问题 我有三个Redux Reducer、actions和Middleware: 喂养 节制 幻灯片放映 feed中间件负责获取新帖子,并将它们存储在feed.posts slideshow reducer维护幻灯片本身的许多状态和业务逻辑,例如,它当前显示的是哪篇文章,下一篇文章应该是什么,等等。它还应该维护一个已过滤的文章列表,例如,不应该有被阻止

我正在重新编写/移植我的大型幻灯片项目,以便React和Redux,这曾经是一个大型jQuery项目,业务逻辑存储在大型类中

我要直接讨论我的问题

我有三个Redux Reducer、actions和Middleware:

  • 喂养
  • 节制
  • 幻灯片放映
feed中间件负责获取新帖子,并将它们存储在
feed.posts

slideshow reducer维护幻灯片本身的许多状态和业务逻辑,例如,它当前显示的是哪篇文章,下一篇文章应该是什么,等等。它还应该维护一个已过滤的文章列表,例如,不应该有被阻止的文章

我面临的问题是:

feed中间件使用新的post发送一个操作,然后feed reducer将post存储在
feed.posts
中。没关系。但是现在我想让幻灯片缩小程序处理帖子,删除被阻止的帖子,等等,然后将它们存储在
slideshow.posts
下,而
feed.posts
将始终包含原始帖子列表,用于其他目的

我目前的解决方案基本上是在slideshow中间件中捕获新帖子操作,然后我用新帖子发送一个新操作,然后可以在slideshow reducer中处理。这感觉是反模式的;使用中间件分派操作,以便可以在不同的缩减器中处理该操作

另一种解决方案是,当新帖子可用时,在提要中间件中调度两个操作:

  • dispatch(feedNewPosts(posts))
  • dispatch(幻灯片下载帖子))
通过这种方式,我可以摆脱中间件黑客,但它也感觉反模式

然后我考虑使用选择器,幻灯片容器将选择帖子并按阻止列表对其进行过滤,等等。但我面临的问题是,我需要知道哪些帖子在幻灯片缩减器中被阻止,因为幻灯片的大部分业务逻辑都发生在那里

下面是一个例子: slideshow中间件调度一个操作以显示下一张幻灯片,
dispatch(slideshowNextSlide())
。 slideshow reducer处理该操作并检查下一步应显示的幻灯片,并将该幻灯片以状态存储为
slideshow.nextSlide
,为动画目的向帖子添加标志,等等。因此,基于此,我需要访问slideshow reducer中过滤的帖子

因此,如果这一切都是由复杂选择器处理的,那么我就不会拥有状态中所需的所有信息,例如,下一张幻灯片应该是哪张,这样我就可以添加正确的动画类,等等

我有什么明显的遗漏吗?也许我试图在状态中存储太多的信息,但我喜欢在状态中保存幻灯片的完整状态,例如,如果我想保存幻灯片状态并稍后加载,等等

slideshow容器和组件将非常愚蠢,只需显示状态中的任何内容,如果帖子匹配
slideshow.nextSlide
,则添加某些动画类,依此类推。没有复杂的选择器

我们将非常感谢在正确方向上的任何帮助


谢谢。

两个减速机听同一个动作完全可以。这是
redux
的好处之一:应用程序上发生的某个事件可能会引起多个组件的兴趣,并且您不希望它们知道其他组件

因此,触发第二个动作将是一种反模式。我的目标是提出一项行动:

dispatch(newPosts(posts))
然后您可以让
提要
幻灯片
还原程序监听相同的操作,并相应地修改它们的状态部分


我认为,在这种情况下,将系统中发生的抽象操作(基于API调用或其他内容的结果,可以使用新的帖子)与将要侦听它的还原程序分开是很重要的。如果你这样做,一个动作修改两个不同的状态片段会让你感觉更自然。

Wow,我对还原子有一些基本的误解。出于某种原因,我认为feed中的操作将只发送给feed减缩器,而不会发送给其他减缩器。感谢您的澄清,非常感谢!更有意义,我想确认一下。让多个减速机响应同一个操作是Redux鼓励的模式!有关更多信息,请参阅我的帖子。你可能还想通读我的文章。