007-组件和Props
一、概述
组件让你可以将用户界面分成独立的,可重复使用的部分,并且可以独立思考每个部分。
从概念上讲,组件就像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.
007-组件和Props的更多相关文章
- 【react】利用prop-types第三方库对组件的props中的变量进行类型检测
1.引言--JavaScript就是一个熊孩子 1.1对于JSer们来说,js是自由的,但同时又有许多让人烦恼的地方.javascript很多时候就是这么一个熊孩子,他很多时候并不会像C和java ...
- Vue组件选项props
前面的话 组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props ...
- Vue.js 系列教程 2:组件,Props,Slots
原文:intro-to-vue-2-components-props-slots 译者:nzbin 这是关于 JavaScript 框架 Vue.js 五个教程的第二部分.在这一部分,我们将学习组件, ...
- 【转存】Vue组件选项props
原帖地址 前面的话 组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 ...
- prop-types:该第三方库对组件的props中的变量进行类型检测
利用prop-types第三方库对组件的props中的变量进行类型检测
- 在vue中子组件修改props引发的对js深拷贝和浅拷贝的思考
不管是react还是vue,父级组件与子组件的通信都是通过props来实现的,在vue中父组件的props遵循的是单向数据流,用官方的话说就是,父级的props的更新会向下流动到子组件中,反之则不行. ...
- Vue 父子组件传值 props
1.Vue 的渲染周期: vue 如何实现响应式追踪. 父子组件通信有很多方式,今天单独聊下props 的方式.我们通过查找官方文档很容发现,props传值有静态和动态两种传值方式. 当然props ...
- React Native中组件的props和state
一.组件的属性(props)和状态(state) 1.属性(props) 它是组件的不可变属性(组件自己不可以自己修改props). 组件自身定义了一组props作为对外提供的接口,展示一个组件时只需 ...
- vue 父子组件通信props/emit
props 1.父组件传递数据给子组件 父组件: <parent> <child :childMsg="msg"></child>//这里必须要 ...
- vue 父子父组件通过props传父页面请求后的数据
父子父组件通过props传父页面请求后的数据,则在父页面的子组件上加上判断数据是否存在即可,如下 <gl-line-bar v-if="oneWeekBetEcharts" ...
随机推荐
- 亚信UED前端流程自动化构建工具
亚信UED前端流程自动化构建工具 .wmd-input, .wmd-input:focus, #md-section-helper {font-size: 14px !important;line-h ...
- 从浏览器输入URL回车发生了什么
在浏览器输入url后回车,整个过程发生了什么?整个过程如果节节细述的话,那非常的复杂.我就简单的描述一下整个过程 1.查询DNS,获取域名对应的IP地址 (1).浏览器搜索自身的DNS缓存 (2).搜 ...
- The Definitive Guide To Django 2 学习笔记(七) 第四章 模板 (三)使用模板系统
接下来,我们开始学习如何使用模板系统,但我们并不和前面说的View相结合,我们的这里的目的是展示模板系统是如何独立于Django框架运行的.下面是在pyhon代码中使用Django模板系统的基础例子: ...
- [复习] JAVA 遍历目录 (递归调用和非递归)
JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...
- [Idea Fragments]2013.08.08
# 1 今晚看到好几篇文章把golang,Node.js还有Nginx-lua拿来说事,Node.js现在自然比较熟悉,golang则有过一些了解,而Nginx-lua则少有听到. 有好事者对Node ...
- 苹果mac版微软官方远程连接工具下载Microsoft Remote Desktop For Mac
官网beta版本,不用再到处找包了. ** 点我访问https://rink.hockeyapp.net/apps/5e0c144289a51fca2d3bfa39ce7f2b06/**
- JS刷新页面后滚动条的位置不变
有时候,在网页中点击了页面中的按钮或是刷新了页面后,页面滚动条又 会回到顶部,想看后面的记录就又要拖动滚动条,或者要按翻页键,非常不方便,想在提交页面或者在页面刷新的时候仍然保持滚动条的位置不变,最好 ...
- 模式识别之Shape Context---利用Shape Context进行形状识别
什么是Shape Context Shape Context是一个用于形状识别的,非常经典的特征(一串便于计算机处理的数字)提取方法,它由Serge Belongie和Jitendra Malik ...
- asscert断言的几种方法
一.什么是断言 执行完测试用例后,最后一步是判断测试结果是通过还是失败,在自动化脚本中一般把这种生成测试结果的方法叫做断言 它用来检查一个条件,如果它为真,则不做任何事,如果它为假,则会跑出Asser ...
- Linux各文件颜色的含义
Linux系统中文件有多种颜色,不同颜色文件代表不同类型的文件,具体如下: 蓝色:目录 绿色:可执行文件 红色:压缩文件 浅蓝色:链接文件 白色:普通文件 黄色:设备文件