(翻译)Presentational and Container Components

news/2024/5/17 20:45:43

这是篇文章翻译自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


http://www.niftyadmin.cn/n/2569913.html

相关文章

clistctrl 单机空白处 会取消选中_你真的会使用CTRL+ENTER组合键吗?

通常我们制作的Excel表格都会设置好格式的,那么在填充公式的时候,可能会拖拉鼠标导致表格格式被改变了,你有没有遇到这些坑:问题既然出来了,自然就有解决的办法,拖拉公式后选择不带格式填充即可&#xff0c…

三星n8000平板_实惠打造网络教学电脑,学生用平板电脑,以及学生儿童模式的设置...

前言现在已经进入2020年3月份,本该是学生开开心心返校上课的日子,虽然新冠病毒疫情已经进入常态化防控管理,但是学生返校是谨而又慎之研究才能决策,当前的学生网络教学是保证学生日常学习的有效方法。很多家长面对网络教学这个新鲜…

linux内存管理_浅谈Linux内存管理那些事儿

本文首发于:浅谈Linux内存管理那些事儿公号:后端技术指南针欢迎关注 持续干货1 前言内存管理是Linux内核中非常重要的部分,今天和大家一起学习一下。当我们要学习一个新知识点时,比较好的过程是先理解出现这个技术点的 背景原因&a…

数据驱动测试概念?

什么是测试数据生成?我们如何产生它? 在我们测试过程中往往需要测试我们场景更加的充分,而创建数据测试。 测试数据包括输入输出,对输出的自动化验证等。 创建测试数据的方法: 1.手动。 2.从生产到测试环境的大量数据拷贝。 3. 自动测试数据…

nbiot开发需要掌握什么_物联网NB-IoT开发与实践教学大纲

《物联网NB-IoT实战开发》课程教学大纲学分:4学时:64适用专业:物联网工程专业一、课程的性质与任务课程的性质:本课程是为物联网工程专业学生开设的课程。课程安排在第四学期。课程的任务:通过本课程的学习,使学生了解…

python 快乐数判断_教你用7类Python运算符,实现丰富多样的运算功能(用代码举例)...

运算这一概念起源于数学,即通过运算法使参与运算的元素得出确定且可重复的结果。作为计算机的核心功能,运算架构起计算机系统的逻辑体系。计算机运算并不局限于普通的数学计算,它更贴近于“逻辑推算”这一概念,其根本目的就是实现…

单元测试java小白_Java程序员一年的成长和蜕变

我叫小肖,毕业于湖南农业大学,计算机科学与技术专业学生,从那年07月25日开始工作,距今也已经一年有余。从一个Java入门小白,到现在能独立开发并且胜任独立工作的能力,在此总结一下个人一年来的成长和蜕变&a…

npm install 安装过程卡住不动

修改 npm 的安装目录下的 npmrc文件 增加一条 registryhttp://registry.cnpmjs.org $ npm config set registry http://registry.cnpmjs.org转载于:https://www.cnblogs.com/xiaobaoTribe/p/10985722.html