本文译自Presentational and Container Components,文章的做者是Dan Abramov,他同时也是Redux和Create React App的做者。 在实际使用React + Redux 技术栈的开发过程当中,很是好的理解了容器型组件和展现型组件的概念是开发出易维护,可复用React App的基础html
在开发React应用的时候,我发现了一种极其简单的开发模式。若是你已经用过一段时间的React,你也许已经发现了它。这篇文章已经讲的很好了,可是我想补充几点。react
若是你将组件分为两类,你会发现它们更容易被复用和理解。我把这两类称为容器型组件 和 展现型组件 ,可是我也据说过其余名字,好比臃肿型组件和简单型组件,智能型组件和傻瓜型组件,有状态组件和纯组件,封装型组件和元组件等等。它们不彻底相同,可是在核心观点上是类似的。git
展现型组件github
this.props.children
控制组件props
接收数据和回调函数state
(若是用到的话,也仅仅是维护UI状态而不是数据状态)state
,生命周期函数或性能优化,一般写成函数式组件,Page
,Sidebar
,Story
,UserInfo
,List
容器型组件web
div
标签,而且不存在样式connect()
,Realy的createContainer
,或者Flux Utils的Container.create()
,而不是手写的UserPage
,FollowersSidebar
,StoryContainer
,FollowedUserList
为了清晰的区分这两种组件,我把放在不一样的文件夹中redux
Sidebar
,Page
,ContextMenu
。而后经过子组件的方式引入而不是在各个容器型组件中复制粘贴已有的样式和布局记住,组件不必定要输出DOM元素,它们只须要提供UI之间的组合关系和分界数组
好好利用这一点性能优化
我建议你先用展现型组件搭建你的app。最终你会意识到你给中间的组件传递了太多的props。有些组件并不使用这些props,而仅仅向下传递。而且当下层组件须要更多数据的时候,你必须重写改写全部的中间组件。这时候就须要引入一些容器型组件。经过这种方式,你能够从叶子节点组件获取数据和方法,而不用考虑处于中间的组件。app
这须要边开发边重构,因此没有必要一次作对。随着平常应用这种模式,你会组件培养出一种『这时候我该抽出一个Container』的直接,就像你已经知道何时应该提取出一个函数同样。个人Redux教程可能也会帮你一把less
展现型组件和容器型组件这种分类并不是十分严格,这是按照它们的目的进行分类。
为了与以前的概念作比较,这是一些相关但不一样的二分法
setState()
方法,有些不用。容器型组件每每是有状态的而展现型组件每每是无状态的,这并非一条铁律。展现型组件也能够是有状态的,容器型组件也能够是无状态的state
,生命周期函数,或者性能优化,这些特性只有在类组件中才可使用。props
的状况下老是输出相同的结果,那咱们称这个组件为pure component。pure component既能够声明为类组件也能够声明为函数式组件,便可以是有状态的也能够是无状态的。另外一个重要的方面是,pure component不依赖props
和state
的深层比对,因此能够在shouldComponentUpdate
方法中进行浅比较优化性能,可是在将来可能有不少变化。展现型组件和容器型组件均可以放进以上任何一种二分法中。在我看来,展现型组件每每是无状态的纯函数组件,容器型组件每每是有状态的纯类组件。然而这并非一种要求,而是一种现象,而且在一些特定的场景中我也确实见过彻底相反的状况。
不要把展现型组件和容器型组件的划分当成教条。有的时候没有必要对两者进行区分。若是你不太肯定一个组件是展现型组件仍是容器型组件,也许如今还不是区分它的时候,别太心急!
Michael Chan为咱们用一个gist阐释了上面的道理