(翻译)Presentational and Container Components

这是篇文章翻译自medium的:Presentational and Container Components

译者语:
这篇文章是紧接着对我上一篇翻译的扩大,对Container Component形式形貌的越发细,处置惩罚了我许多开辟中的疑心。

Presentational and Container Components

在我写React顺序的时刻,我发明一个形式异常的好用。对React有一定履历的人,一定已对这个形式有过相识。这篇文章已做了很好的引见,然则在这里我想要再补充几点。
当你把你的组件分红两种差别的范例,你会发明他们会异常轻易复用和邃晓。这两种范例,我称为Container and Presentational components(译者:可翻译为容器和展示组件,因为社区中常以英文名字涌现,所以不翻译)。固然,我也听过Fat and Skinny, Smart and Dumb, Stateful and Pure, Screens and Components等等,这些东西虽然不完整雷同,然则他们的中心思想是一样的。

Presentational components:

  • 关注于该如何展示

  • 中心也许会包括presentational和container组件,同时也能够包括本身的一些JSX代码和款式代码

  • 许可经由过程this.props.children来通报内容

  • 不和app的其他地方发生依靠关联,比方没有Flux的actions、stores

  • 不关注数据是怎样加载和处置惩罚的

  • 只经由过程props来猎取数据和回掉函数

  • 平常没有本身的state(纵然有,也只是UI状况,而不是数据)

  • 除非组件须要state,生命周期或许机能优化,能够运用functional components的体式格局举行声明

  • 举个栗子:Page, Sidebar, Story, UserInfo, List

Container components:

  • 关注与该怎样运转

  • 中心能够包括presentational和container组件,除非包裹用的div的一些款式,平常不会含有任何款式

  • 向包括的presentational和其他的container components通报数据和行动要领

  • 挪用Flux的actions或许把这些actions作为回掉函数传给presentational components

  • 因为他们常常作为数据泉源的角色,所以container平常会包括state

  • 平常会由更高品级的components来天生,比方React Redux的connect(), Relay的createContainer(), Flux Utils的Container.create()

  • 举个栗子:UserPage, FollowersSidebar, StoryContainer, FollowedUserList

一般,我会把它们放到差别的文件夹下面,以便辨别。

这么做的优点

  • 职责星散。如许你会更轻易邃晓你的app和UI。

  • 更容易复用。同一个presentational component,也能够被用在差别的数据源下。

  • presentational component能够作为一个“调色板”。你能够把它放在一个页面上,让设计师在不须要晓得app逻辑的状况下,随便转变相干变量。

  • 如许做能够强制你写一些“规划组件”,比方Sidebar, Page, ContextMenu,然后经由过程this.props.children来通报内容,而不是在差别的container中写一大堆雷同的代码。

为何要运用Containers

我起首发起你先不运用这个形式来搭建你的app,末了发明你会通报太多的props给中心组件。关于许多中心组件来讲,他们并不须要这些props,然则他们还必须通报给下一级组件。同时,假如下级组件须要增添一个数据,那末你就须要一起修正到最上面。这个时刻,就是你须要引入Container and Presentational component的时刻。如许子根组件就能够取得须要的数据和行动要领,而不会去修正那些没有关联的中心组件。
不要希冀你刚开始就能把两种组件做出准确的辨别。当你取得更多的履历,你就会晓得该什么时刻用container什么时刻用presentational组件,就像你晓得什么时刻要声明一个function一样。这个免费的教程能够协助你。

一些辞汇

你须要邃晓,container和presentational components的差别并非技术上的差别,而是目标上的差别。

作为对照,这里列出一些辞汇:

  • Stateful and Stateless 有一些组件运用React.setState()要领,有些不须要用。Container更倾向于Stateful,而Presentational更倾向于Stateless,固然这并非相对的。Presentational能够使Stateless,Container也能够是Stateful

  • Classes and Functions 一个组件能够经由过程class和function举行声明。Functional components更简约一些,他们缺乏许多class含有的功用。这些也许今后会有转变,然则如今确切存在。因为functional components比较轻易邃晓,所以我发起你运用functional components, 除非你须要state, 生命周期和机能优化这些只要class开放的功用.

  • Pure and Impure假如雷同的props和state,会返回雷同的效果,那末这个component就是pure的。Pure组件能够用class或function来声明,他也能够是stateful的,也能够是stateless的。别的一个主要的区别是,pure组件并不依靠于深层的props和state,所以他们能够经由过程在shouldComponentUpdate()中浅层对照来举行优化。如今这个要领只在class中存在,也许今后会加入到function中。

Presentational和Container组件都能够是恣意的一种状况。依据我的履历,presentational组件倾向于stateles pure functions, 而container更倾向于stateful pure classes。固然这只是基于视察得出的效果,我也曾看到过完整差别的状况。
记着,不要把presentational和container辨别的那末显著。有的时刻很难去画出一个分界线来。假如你不确定一个组件应该是presentational照样container,那末也许还太早去辨别它。

结束语

在初期的文章中,我说presentaional container只能包括presentational components。如今我并不这么以为。

这是篇文章翻译自medium的:Presentational and Container Components

    原文作者:Clark
    原文地址: https://segmentfault.com/a/1190000007788858
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞