Components and Props - 组件和属性
组件允许你分隔UI为独立的、可重用的零件,每个零件是隔离的。
概念上,组件就像js的函数。它们接收任意的输入(被称为 'props'),并返回React元素,用以描述应该在屏幕上显示的内容。

Functional and Class Components - 函数式组件和类组件
定义一个组件的最简单方式是写一个js函数:

     function Welcome(props) {return <h1>Hello, {props.name}</h1>;}

这个函数是一个有效的React组件,因为它接收单个的 'props' 对象参数,并返回一个 'React元素'(同组件的定义相同)。我们称这样的组件为 '函数式',因为,它们字面上是js函数。
你也可以使用一个ES6类来定义一个组件:

     class Welcome extends React.Component {render() {return <h1>Hello, {this.props.name}</h1>;}}

从React的角度来看,这2个组件是等同的。
类组件有一些额外的功能,我们将在下章节讨论。接下来,我们将使用函数式组件,因为它们的简洁性。

Rendering a Component - 渲染一个组件
之前,我们仅碰到过React元素,代表DOM标签:

     const element = <div />;

然而,元素也可以代表用户定义的组件:

     const element = <Welcome name="dong" />;

当React看到一个代表用户定义组件的元素时,它将JSX属性传递给这个组件,JSX属性作为单个对象,我们称为 'props'。
例如,下面的代码在页面上渲染 'Hello, Sara':

     function Welcome(props) {return <h1>Hello, {props.name}</h1>}const element = <Welcome name="Sara" />;ReactDOM.render(element,document.getElementById('root'););

让我们简要阐述上面这个例子中都发生了什么:
1.我们使用 '<Welcome name="Sara" />',调用 'ReactDOM.render()'。
2.React调用 'Welcome' 组件,传递 '{name: 'Sara'}' 作为props。
3.我们的 'Welcome' 组件返回一个 '<h1>Hello, Sara</h1>' 元素作为结果。
4.React DOM高效地更新DOM为 '<h1>Hello, Sara</h1>'
警告:
组件名总是以 '大写字母' 开始。
例如,'<div />' 代表一个 DOM 标签,而 '<Welcome />'代表一个组件,并包含'Welcome'到作用域内。

Composing Components - 组件构成
组件可在输出中,包含其他组件。这让我们对于任何级别的细节,都可以使用相同的组件抽象。在React应用中,按钮、表单、对话框、屏幕,所有的这些都可以被表示为组件。
例如,,我们创建一个 'App' 组件,多次渲染 'Welcome' 组件:

     function Welcome(props) {return <h1>Hello, {props.name}</h1>;   }function App() {return (<div><Welcome name="dong" /><Welcome name="xue" /><Welcome name="min" /></div>);}ReactDOM.render(<App />,document.getElementById('root'));

明显的,新的React应用在顶级,包含单个 'App' 组件。然而,如果你将React和一个已经存在的应用融合,你可能想要以一个小的、底层的组件开始,就像 'Button' 组件,并以你的方式,逐步涉及到视图层的顶部。
警告:
组件必需返回单个的 'root element - 根元素'。这也是为什么我们在所有的 <Welcome /> 组件外层,添加一个 <div> 的原因。

Extracting Components - 提取组件
别害怕将组件分隔成更小的组件。
例如,思考这个 'Comment' 组件:

     function Comment(props) {return (<div className="Comment"><div className="UserInfo"><img className="Avatar"src={props.author.avatarUrl}alt={props.author.name}/><div className="UserInfo-name">{props.author.name}</div></div><div className="Comment-text">{props.text}</div><div className="Comment-date">{formatDate(props.date)}</div></div>);}

它接收 'author'(对象),'text'(字符串),'date'(日期) 作为props,描述了一个在社交媒体网站上的评论。
因为所有的嵌套,这个组件不容易被改变,并且重用它的各部分也很困难。
首先,我们将提取 'Avatar' 组件:

     function Avatar(props) {return (<img className="Avatar"src={props.author.avatarUrl}alt={props.author.name}/>);}

'Avatar' 组件不需要知道它被渲染在一个 'Comment' 组件内部。这就是为什么我们给了它一个更通用的名字作为它的props:'user' 而不是 'author'。(该组件可用于很多场合,而非只是评论、文章)
我们建议从组件的角度来考虑,而不是从它正在使用的上下文,来命名 'props'。
现在我们可以把 'Comment' 组件简化一点点:

     function Comment(props) {return (<div className="Comment"><div className="UserInfo"><Avatar user={props.author} /><div className="UserInfo-name">{props.author.name}</div></div><div className="Comment-text">{props.text}</div><div className="Comment-date">{formatDate(props.date)}</div></div>);}

下一步,我们将提取 'UserInfo' 组件,在用户名的下方显示头像:

     function UserInfo(props) {return (<div className="UserInfo"><Avatar user={props.user} /></div><div className="UserInfo-name">{props.author.name}</div>);}

这让我们更进一步简化 'Comment' 组件:

     function Comment(props) {return (<div className="Comment"><UserInfo user={props.author} /><div className="Comment-text">{props.text}</div><div className="Comment-date">{formatDate(props.date)}</div></div>);}

提取组件最初可能看着是繁重的工作,但是将有一个可重用的组件库的回报,在一些更大的应用中。提取组件的一个好的经验是:如果你的UI中的一部分使用了好多次(按钮、面板、头像),或者组件本身有点复杂(App、FeedStory、Comment),就应该提取组件。

Props are Read-Only - 属性是只读的
不管你使用函数式还是类,声明一个组件,绝不能修改它自己的props。思考 'sum' 函数:

     function sum(a, b) {return a + b;}

这类函数被称作 'pure'(纯函数),因为它们不尝试修改它们的输入,并且相同的输入总是返回相同的结果。
与此相反,下面的函数式不纯的,因为它修改了自己的输入:

     function withdraw(account, mount) {account.total -= amount;    }

React是相当灵活的,但是它有一个严格的规定:
所有React组件必需表现的像纯函数一样,尊重它们的props(props会传递给组件,所以不能修改props)
当然,UI应用是动态的,可以随着时间改变。在下个章节,我们将介绍一个新的概念,'state-状态'。state状态允许组件随着时间改变它们的输出,来响应用户操作、网络响应以及其他任何别的,而不会去破环上面这条规则!

React中文文档之Components and Props相关推荐

  1. react中文文档、英文文档及JavaScript相关文档及web前端相关资料

    一. react中文文档 https://doc.react-china.org 二. react英文文档 https://reactjs.org 三.react Github https://git ...

  2. React中文文档之Forms

    Forms - 表单 在React中,HTML表单元素同其他DOM元素,有点不同.因为表单元素天生具备一些内部的state状态.例如:下面的HTML表单接收一个名字: <form>Name ...

  3. React中文文档之Thinking in React

    Thinking in React - 思考React 在我们看来,React是使用js来创建大的.速度快的web应用的首选方式.它已经在Facebook和Instagram表现的非常好. React ...

  4. React中文文档之Handling Events

    Handling Events - 事件处理 React元素的事件处理同DOM元素的事件处理非常相似. 有一些语法不同: 1.React事件使用 'camelCase-驼峰式' 命名,而不是 'low ...

  5. React中文文档之Conditional Rendering

    Conditional Rendering - 有条件的渲染 在React中,你可以创建唯一的组件,来封装你需要的行为.之后,你可以仅仅渲染它们中的一些,这取决于你应用的状态. React中的有条件的 ...

  6. React中文文档之introducing JSX

    introducing JSX 思考下面的变量声明: const element = <h1>Hello world!</h1>; 这个有趣的标签解析,既不是字符串,也不是HT ...

  7. React中文文档之State and Lifecycle

    state 和 生命周期 到目前为止,我们仅仅学习了一种方式来更新UI. 我们调用 'ReactDOM.render()' 来改变输出渲染: function tick() {const elemen ...

  8. React中文文档 8. 列表 Key

    1.遍历 const numbers = [1, 2, 3, 4, 5];const listItems = numbers.map((number) =><li>{number}& ...

  9. React中文文档之Rendering Elements

    Rendering Elements - 渲染元素 元素是React应用的最小构建块 一个元素描述了你想要在屏幕上看到的内容: const element = <h1>Hello, wor ...

最新文章

  1. 图解支付宝钱包技术架构
  2. 根据经纬度批量计算多个点到多个点之间的距离
  3. 9.任务段(TSS)
  4. 在c语言中scanf什么时候用,scanf什么时候用??c语言?
  5. 新年奉献MVC+EF(CodeFirst)+Easyui医药MIS系统
  6. GitHub之GitHub Actions的项目自动化持续集成和部署
  7. 第十二届蓝桥杯省赛A组试题:左儿子右兄弟Java
  8. Android权限【大全】 .
  9. TypeScript接口
  10. 被除数、除数、商、余数的正负号规律二
  11. PYTHON语言之常用内置函数
  12. MongoDB3.4为单独的数据库创建用户
  13. 指尖初体验之虚拟键盘
  14. 小心那些年末还在努力的狠人!
  15. 这是用过的最差树形插件
  16. paip.mysql 性能跟iops的以及硬盘缓存的关系
  17. 21天学通Java学习笔记-Day03
  18. sklearn.utils.Bunch的属性
  19. python正则表达式的学习
  20. 北京电子邮箱账号密码登录技巧

热门文章

  1. ocx 加载 页面卡死
  2. Cannot read property ‘$message‘ of undefined
  3. 火星坐标系转百度php,PHP版本实现火星,高德地图和百度地图坐标转换
  4. Python爬虫系列之爬取微信公众号新闻数据
  5. matlab自带的音乐,MATLAB乐器(如何用matlab演奏音乐)
  6. 支理解SVM的三层境界
  7. php 监听条码枪输入,使用jQuery监听扫码枪输入并禁止手动输入的实现方法
  8. 航拍无人机 无人车_无人机将有自己的时刻
  9. ai替换混合轴例子_可解释的vs可解释的AI:一个直观的例子
  10. 【拓扑学知识】4.拓扑性质--分离公理与可数公理(分离性和可数性)