Redux 展示组件和 容器组件 应该如何设计?

#1

redux 有 presentational (展示组件)和 container component (容器组件) 的概念 ,容器组件负责拉取数据 ,通过props传递给展示组件。如果层次关系简单倒也还好。如果组件层级多了呢?
比如容器组件A ,包含 展示组件 A-B, A-B 包含展示组件 A-B-C。

A   ->>   
       A-B ->> 
                     A-B-C 

此时,如果A要传递数据给 A-B-C, 那么需要先一层一层传递下去,先传递给A-B,再到A-B-C,但其实这些数据 ,对于作为中间层的A-B来说,是完全无关的。它只是作为一个传递者,但同样需要因为props的变动而重新渲染。是否会浪费性能,请问各位是如何处理的?

对于如何设计展示组件 ,翻阅各种文章之后还是有些迷惑,求教各位,有没有好的开源项目可以参考 ?

#2

性能问题不用太担心,虚拟dom会帮你优化避免没有变动的渲染。
一层一层传递的确是个问题,使用redux后已经比不用好很多了,但有时候还是会写得很烦,这就需要对组件好的规划了。
现在感觉用mobx会爽很多,但还是缺少最佳实践啊。

#3

是的。这可能就是很多人觉得React写起来麻烦的地方。在还没有开始写之前 ,就需要通过不断的搜索问题了。

mobx还没用过,近期听得蛮多了,不知道对比redux有什么样的优点缺点呢?

#4

展示组件用 PureComponent,就好,没有重复渲染。

#5

如果展示组件有内部状态的话,应该就不能purecomponent吧?

#6

也是可以的,purecomponent 就是对 shouldComponentUpdate 做了优化。不推荐使用 纯函数的组件。

#7

可以看一下这篇博客https://github.com/sorrycc/blog/issues/3。
像楼主担心的性能问题,mobx直接就能解决,而且比PureComponent或者写shouldComponentUpdate更好。一层一层传递也是一样,入门用起来很方便,也很容易懂。
其实代码就这样,麻烦也有麻烦的好处,用redux看上去是麻烦了很多,action -> dispatch -> reducer,但是却规范了代码,数据变动有迹可循。mobx最大的问题就是要想办法约束他的灵活性才能适应大型工程吧。

#8

目前的小项目边学边做边练也做了一小半了,只好在下个小项目再试试mobx了。:grin:

#9

一种非常常见的定位和地区选择的组件模型。

A、一个容器组件,用来显示各种信息,并且import一个显示地址的B组件。(容器组件)

B、一个定位显示组件,往往是一个地名+向下的箭头。(展示组件)

C、一个地区组件,可以选择全国各地,往往有很多按钮和列表组成,而且他是一个覆盖整个屏幕的网页。(展示组件or容器组件?待定)

容器组件:一般可以当做一个完整的页面。

展示组件:通常是指一个页面的局部模块。

组件B在组件A中,那么就是A包含B,B是A的子集,所以我们可以说A是容器组件,B是展示组件。

但是组件C的情况就有些不一样了。

组件C可以是容器组件、也可以是展示组件,为什么这样说呢?

假设组件C是容器组件,这当然没什么问题,因为地区选择可以看成是一个完整的网页,点击组件B选择地区的时候,进入容器组件C的路由,选择好地区之后,再返回容器A的路由,显示新的地区数据。

假设组件C是展示组件,what?怎么当做展示组件呢?展示组件的特点就是需要在组件A里面import组件C,根据state来判断是否显示组件C,这样做就不需要跳转路由,而是在当前hash完成操作。

所以,在不同的场景下,组件的性质是可以切换的。这也是组件化开发的好处之一,灵活多场景调用。

1 Like
#10

确实不必太拘泥于容器还是展示组件,往往很难在一开始就能确定一些事情,只好边开发边构建了。谢谢你的回复