一、概述

  组件让你可以将用户界面分成独立的,可重复使用的部分,并且可以独立思考每个部分。

  从概念上讲,组件就像JavaScript函数一样。他们接受任意输入(称为“props”)并返回描述屏幕上应显示内容的React元素。

1.1、功能和类组件

函数【方法】和类都能定义组件

1.1.1、函数方式定义

定义组件的最简单方法是编写一个JavaScript函数:

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

  这个函数是一个有效的React组件,因为它接受一个包含数据的“props”(代表属性)对象参数并返回一个React元素。我们称这些组件为“功能性”,因为它们实际上是JavaScript功能。

1.1.2、ES6 类方式定义

也可以使用ES6类来定义组件:

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

以上两个组件与React的观点相同。 类有一些额外的功能

1.2、渲染一个组件

以前,我们只遇到了表示DOM标签的React元素:

const element = <div />;

但是,元素也可以表示用户定义的组件:【其中WelCome是1.1所定义的组件,name为参数属性】

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

当React查看表示用户定义组件的元素时,它会将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调用带有{name:'Sara'}的WelCome组件作为props。

3、WelCome组件返回一个<h1> Hello,Sara </ h1>元素作为结果。

4、React DOM有效地更新DOM以匹配<h1> Hello,Sara </ h1>。

注意:始终使用大写字母开始组件名称。

  React将以小写字母开头的组件视为DOM标签。例如,<div />表示一个HTML div标签,但<Welcome />表示一个组件,并且要求Welcome属于范围。

1.3、复杂组件

  组件可以在其输出中引用其他组件。这让我们可以对任何细节级别使用相同的组件抽象。一个按钮,一个窗体,一个对话框,一个屏幕:在React应用程序中,所有这些都通常表示为组件。

  例如,我们可以创建一个呈现Welcome多次的App组件:

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

  通常,新的React应用程序在顶部有一个应用程序组件。但是,如果您将React集成到现有的应用程序中,则可以使用Button之类的小组件自下而上地开始,并逐渐走向视图层次结构的顶部。

1.4、提取组件

不要害怕将组件分解成更小的组件。

示例参看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 (an object), text (a string), and date (a date) as props, and describes a comment on a social media website.

由于所有的嵌套,这个组件可能会很难改变,并且很难重用它的各个部分。我们从中提取一些组件。

首先,我们将提取Avatar

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

现在变成

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 className="UserInfo-name">
{props.user.name}
</div>
</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>
);
}

1.5、Props是只读的

无论你是将一个组件声明为一个函数还是一个类,它都不能修改它自己的道具。考虑这个总和函数:

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

  这些函数被称为“纯粹的”,因为它们不会尝试改变它们的输入,并且总是为相同的输入返回相同的结果。

相反,这个函数是不纯的,因为它改变了它自己的输入:

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

React非常灵活,但它有一个严格的规则:

  All React components must act like pure functions with respect to their props.

  所有的React组件都必须像纯函数一样对它们的props起作用。
如果需要改变的话需要了解状态,状态允许React组件在不违反此规则的情况下响应用户操作,网​​络响应和其他任何内容而随时间改变其输出。

007-组件和Props的更多相关文章

  1. 【react】利用prop-types第三方库对组件的props中的变量进行类型检测

    1.引言--JavaScript就是一个熊孩子   1.1对于JSer们来说,js是自由的,但同时又有许多让人烦恼的地方.javascript很多时候就是这么一个熊孩子,他很多时候并不会像C和java ...

  2. Vue组件选项props

    前面的话 组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props ...

  3. Vue.js 系列教程 2:组件,Props,Slots

    原文:intro-to-vue-2-components-props-slots 译者:nzbin 这是关于 JavaScript 框架 Vue.js 五个教程的第二部分.在这一部分,我们将学习组件, ...

  4. 【转存】Vue组件选项props

    原帖地址 前面的话 组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过  ...

  5. prop-types:该第三方库对组件的props中的变量进行类型检测

    利用prop-types第三方库对组件的props中的变量进行类型检测

  6. 在vue中子组件修改props引发的对js深拷贝和浅拷贝的思考

    不管是react还是vue,父级组件与子组件的通信都是通过props来实现的,在vue中父组件的props遵循的是单向数据流,用官方的话说就是,父级的props的更新会向下流动到子组件中,反之则不行. ...

  7. Vue 父子组件传值 props

    1.Vue 的渲染周期: vue 如何实现响应式追踪. 父子组件通信有很多方式,今天单独聊下props 的方式.我们通过查找官方文档很容发现,props传值有静态和动态两种传值方式. 当然props ...

  8. React Native中组件的props和state

    一.组件的属性(props)和状态(state) 1.属性(props) 它是组件的不可变属性(组件自己不可以自己修改props). 组件自身定义了一组props作为对外提供的接口,展示一个组件时只需 ...

  9. vue 父子组件通信props/emit

    props 1.父组件传递数据给子组件 父组件: <parent> <child :childMsg="msg"></child>//这里必须要 ...

  10. vue 父子父组件通过props传父页面请求后的数据

    父子父组件通过props传父页面请求后的数据,则在父页面的子组件上加上判断数据是否存在即可,如下 <gl-line-bar v-if="oneWeekBetEcharts" ...

随机推荐

  1. 0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚

    @Transactianal注解有一些属性,见Spring-Framework-Reference Table17.3 Transactional-settings @Transactional(pr ...

  2. mybatis传多个参数实例

    最近在做一个统计功能,有一个功能点:根据id更新某字段的值.那么就需要有两个参数,我的做法: dao层: int updateTaskCount(int taskCount,int id); 对应的m ...

  3. Unable to parse request org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. null

    最近做一个web项目中有上传文件的功能,已经写出并在本地和部署到服务器上测试了好几个文件上传都没问题(我用的是tomcat).部署上服务器,上传图片时有的图片大就回在tomcat日志报如下错误: Un ...

  4. Chrome调试ECMAScript之断点debug技巧大全!

    这篇文章主要介绍了使用Chrome调试JavaScript的断点设置和调试技巧,需要的朋友可以参考下 你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍 ...

  5. sublime3 Package Control不能使用

    手动下载插件包:https://sublime.wbond.net/Package%20Control.sublime-package,复制到%SumlimeText_HOME%\Data\Insta ...

  6. 第二百一十三节,jQuery EasyUI,NumberBox(数值输入框)组件

    jQuery EasyUI,NumberBox(数值输入框)组件 功能:只能输入数值,和各种数值的计算 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI ...

  7. 将int型数字转换成6位字符串,不足的时候,前面补0

    将int型数字转换成6位字符串,不足的时候,前面补0 方法一: int num = 123; num.ToString("000000"); 方法二: int num = 123; ...

  8. 解决在SharePoint 2010/2013部署自己的Event Handler后,抛出”不能载入被引用的第三方的程序集&quot;的问题

    今天在处理客户的一个问题的时候.我们已经把我们SharePoint EventHandler依赖的第三方的TIBCO.EMS.dll注冊到GAC里面了,可是日志里面还是抛出了不能载入被引用的第三方的程 ...

  9. [转]使用TeamCity对项目进行可持续集成管理(一)

    一.可持续集成管理 持续集成,CI:即Continuous integration. 可持续集成的概念是基于团队(小组)协作开发而提出来的,为了提高团队开发效率与降低集成风险(早发现,早解决.晚发现, ...

  10. DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016错误解决方法

    这个错误是:表处于"装入暂挂"状态. 经多次尝试 总结方法: 1:reorg table <表>: 假如不好使 则下面方法 2,先前尝试装入(LOAD)此表失败.表的状 ...