做出反应。如果展示组件包含容器组件会很糟糕吗?

Posted

技术标签:

【中文标题】做出反应。如果展示组件包含容器组件会很糟糕吗?【英文标题】:React. Is it bad if presentational components contain container components? 【发布时间】:2016-08-15 07:59:01 【问题描述】:

根据https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.i63w9pvzw

演示组件:

内部可能同时包含展示组件和容器组件**,并且通常有一些自己的 DOM 标记和样式。 不依赖于应用程序的其余部分,例如 Flux 操作或存储。

我认为如果展示组件包含容器组件,它们将依赖于 Flux 或 Redux(或任何容器组件所依赖的)。

这将使演示组件难以测试和重用。

【问题讨论】:

有问题吗? @aet 我想知道包含容器组件的展示组件是否不好? 很公平。答案并不直截了当。有人可能会争辩说,最好构建应用程序,这样您就不需要嵌套容器组件。例如,使用 redux,没有什么能阻止您将整个 state 对象作为 props 传递给每个组件(这是一种常见的模式),从而消除了对这些容器的需求。但也许你这样做有一个很好的理由,比如如果一个子组件需要状态并且该状态恰好是一个大对象,如果它被传递给每个人,性能可能会受到影响。 【参考方案1】:

还不错,很好。 react-redux 的全部意义在于让您将容器组件直接连接到商店,而不必将整个商店作为道具传递给每个组件。组件重用不是问题,因为<Provider> 组件将使任何连接的容器组件在其下方的任何位置工作。

实际上,测试容器组件也不难。您可以将连接的组件设置为默认导出,也可以将未连接的组件导出为命名导出,您可以将其用于测试,并在这些测试中手动传递道具。有关详细信息,请参阅'Writing Tests' part of the Redux docs 的“连接组件”部分。

至于测试包含容器组件的展示组件,这不是问题。浅渲染在测试中仍然可以正常工作(除非您遇到this issue)。如果您需要在测试中挂载组件,您始终可以将其包装在 <Provider> 组件中,并使用特定于该测试的存储。

编辑:此答案特定于带有 react-redux 的 Redux。我不知道其他 Flux 实现可能会遇到一些困难。

【讨论】:

以上是关于做出反应。如果展示组件包含容器组件会很糟糕吗?的主要内容,如果未能解决你的问题,请参考以下文章

在页面加载时将道具传递给子组件 - 与 next.js 做出反应

react容器组件和UI组件

Unity UI按钮不对点击或悬停做出反应

vue中小型项目开发浅谈

表单作为具有反应的功能组件

如何将一个反应组件传递给另一个反应组件以包含第一个组件的内容?