为什么 redux 建议只连接顶级组件?

IT技术 reactjs redux
2021-05-19 03:12:47

我是 redux 和 react-redux 的新手,同时我正在尝试制作一个 redux 应用程序。

我不明白 redux 文档上的声明:

然后,我们使用 react-redux 中的 connect() 函数包装要连接到 Redux 的组件。尝试仅对顶级组件或路由处理程序执行此操作。虽然从技术上讲,您可以将应用程序中的任何组件 connect() 到 Redux 商店,但请避免这样做太深,因为它会使数据流更难跟踪。

连接到所有组件并且当状态更新时,每个组件都可以获得新的状态树不是更容易吗?

为什么是哑组件和高级容器?

谢谢。

4个回答

如前所述,Abramov(Redux 的作者)已经回溯了他关于connect()ed 组件的建议他在这篇 Reddit 帖子中阐述了一个很好的经验法则

我这样做:

  1. 从使用一个容器和几个展示组件开始

  2. 随着展示组件树的增长,“中间”组件开始向下传递太多的 props

  3. 此时,我将一些叶子组件包装到容器中,这样“中间”组件就不需要接受和传递与它们完全无关的 props

  4. 重复

如果您观看我关于 Egghead 的课程的最后十个视频,这正是我演示的方法:https : //egghead.io/series/getting-started-with-redux

根据我的阅读,最初的建议与connect()性能无关,而与module化组件和大型应用程序中数据流的易用性有关。

事实上,connect()与 1-container-to-rule-them-all top-heavy 模式相比,更多的ed 组件可能是一个性能优势。 阿布拉莫夫再次

这两种方法都很好,嵌套的 connect() 组件实际上会给你更多的性能。缺点是它们与应用程序的耦合度稍高,测试难度稍大,但这可能不是什么大问题。

当我在顶部有一个容器时,我遇到了效率问题,因为 React 在树中某处的最轻微更新期间重新渲染了我的所有组件。所以我放弃了这种方法,并针对文档制作了我的应用程序,结果证明它更快。

但后来我看到甚至 Redux 作者在他的 Twitter 上写道:

在 Redux 示例中强调“顶部有一个容器组件”是错误的。不要把这当作格言。

https://twitter.com/dan_abramov/status/668585589609005056

尽量保持你的演示组件分开。在方便时通过连接它们来创建容器组件。 https://twitter.com/dan_abramov/status/668586001175048192

答案在您摘录的文档的本节中:

虽然从技术上讲,您可以将应用程序中的任何组件 connect() 到 Redux 商店,但请避免这样做太深,因为它会使数据流更难跟踪。

Redux 的核心原则之一是数据通常应该自上而下流动,即它应该是单向的。如果您的connect低级组件太多,您的数据流不再是单向的。 这样做的主要后果是组件之间更容易出现不一致的状态。

当自上而下时,当您只连接有限数量的高级组件时自然会发生这种情况,创建状态不一致的情况要困难得多,因此文档中的建议。

阅读我在此处发布答案时的最新答案,我想进一步增加使用官方Redux 样式指南连接每个组件的共识

更喜欢让更多 UI 组件订阅 Redux 存储并在更细粒度的级别读取数据。这通常会带来更好的 UI 性能,因为当给定的状态发生变化时,需要渲染的组件更少。

例如,不是仅仅连接一个<UserList>组件并读取整个用户数组,而是<UserList>检索所有用户 ID 的列表,将列表项呈现为<UserListItem userId={userId}>,并已<UserListItem>连接并从商店中提取其自己的用户条目。

这适用于 React-Redux connect()API 和useSelector()钩子。