组件&Props

组件&Props

组件可以将UI切分成一些独立的、可复用的部件,这样你就只需要专注于构建每一个单独的组件。

组件从概念上看就像是函数,它可以接受任意的输入值(称之为“props”),并返回一个需要在页面上展示的React元素。

函数定义/类定义组件

定义一个组件最简单的方式是使用javascript函数:

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

该函数是一个有效的React组件,它接受一个单一的“props”对象,并返回一个React元素。我们之所以称这种类型的组件为函数定义组件,是因为从字面上来看,它就是一个javascript函数。

你也可以使用ES6 class来定义一个组件:

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

上面两个组件在React中是相同的。

组件渲染

在前面,我们遇到的React元素都只是DOM标签:

const element = <div/>;

然而React元素也可以是用户自定义的组件:

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'}作为props传入并调用Welcome组件。
  3. Welcome组件将<h1>Hello, Sara</h1>元素作为结果返回。
  4. React DOM将DOM更新为<h1>Hello, Sara</h1>

注意:组件名称必须以大写字母开头。

例如,<div/>表示一个DOM标签,但<Welcome />表示一个组件,并且在使用该组件时必须定义或引入它。

组合组件

组件可以在它的输出中引用其他组件,这就可以让我们用同一组件来抽象出任意层次的细节。在React应用中,按钮,表单,对话框,整个屏幕的内容等,这些通常被表示为组件:

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应用程序的顶部是一个App组件。但是,如果要将React集成到现有应用程序中,则可以从下而上使用像Button这样的小组件作为开始,并逐渐运用到视图层的顶部。

注意:组件的返回值只能有一个根元素。这也是我们要用一个div来包裹所有<Welcome/>元素的原因。

提取组件

你可以将组件且分为更小的组件,这没什么好担心的。

例如下面的Comment组件:

function Comment(props){
return (
<div ClassName="Comment">
<div className="userInfo">
<img
src = {props.author.avatatUrl}
alt = {props.author.name}
/>
</div>
<div className="userInfo-name">{props.author.name}</div>
<div/>
<div className="Comment-text">
{props.text}
</div>
<div className="Comment-date">
{formatDate(props.date)}
</div>
)
}

这个组件接受author对象,text字符串,以及date时间对象作为props,用来描述一个社交媒体网站上的评论。

这个组件由于嵌套,变得难以被修改,可复用的部分也难以被复用。所以我们从这个组件中提取出一些小组件。

首先,提取Avatar组件:

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

Avatar作为Comment的内部组件,不需要知道是否被渲染。因此我们将author改为一个更通用的名字user

我们建议从组件自身角度来命名props,而不是根据组件的上下文命名。

现在我们可以对Comment组件做出以下小小的调整:

function Comment(props) {
return (
<div className="Comment">
<div className="UserInfo">
<Avatar user={props.author} /> //抽离出的Avatar组件
<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组件,用来渲染Avatar旁边的用户名:

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

提取组件后使Comment组件看起来更加简洁。

React 组件&Props的更多相关文章

  1. React组件系统、props与状态(state)

     多个组件合成一个组件: var style = { fontSize: 20, color: '#ff0000' }; var WebSite = React.createClass({ rende ...

  2. React学习笔记 - 组件&Props

    React Learn Note 4 React学习笔记(四) 标签(空格分隔): React JavaScript 三.组件&Props 组件可以将UI切分成一些独立的.可复用的部件,这样你 ...

  3. React组件(组件属性this.state和this.props,css样式修饰组件)

    目录: 1.创建组件的第一种方式 function2.将组件抽离为单独的jsx文件3.省略.jsx后缀, 配置webpack设置根目录4.创建组件的第二种方式--使用class关键字创建组件5.组件私 ...

  4. React组件的state和props

    React组件的state和props React的数据是自顶向下单向流动的,即从父组件到子组件中,组件的数据存储在props和state中.实际上在任何应用中,数据都是必不可少的,我们需要直接的改变 ...

  5. React组件三大属性之 props

    React组件三大属性之 props 理解1) 每个组件对象都会有props(properties的简写)属性2) 组件标签的所有属性都保存在props中 作用1) 通过标签属性从组件外向组件内传递变 ...

  6. React 组件性能优化探索实践

    转自:http://www.tuicool.com/articles/Ar6Zruq React本身就非常关注性能,其提供的虚拟DOM搭配上Diff算法,实现对DOM操作最小粒度的改变也是非常的高效. ...

  7. webpack 打包一个简单react组件

    安装Webpack,并加载一个简单的React组件 全局的npm模块安装: npm install -g webpack 安装jsx-loader npm install --save-dev jsx ...

  8. React 组件性能优化

    React组件性能优化 前言 众所周知,浏览器的重绘和重排版(reflows & repaints)(DOM操作都会引起)才是导致网页性能问题的关键.而React虚拟DOM的目的就是为了减少浏 ...

  9. React组件属性部类(propTypes)校验

    React组件属性类型(propTypes)校验 Prop 验证 随着应用不断变大,保证组件被正确使用变得非常有用.为此我们引入propTypes.React.PropTypes 提供很多验证器 (v ...

随机推荐

  1. 「题解」:$Game$

    问题 B: $Game$ 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 对于最初加入的每一个元素开桶记录出现次数. 然后记录一个前p个元素最大值. 先由先手玩家取走一 ...

  2. flink提交文件出现java.io.IOException:unable to close file because the last block does not have enough number of replicas异常

    当提交已经打包好的jar包时候,控制台出现以下的错误.

  3. angular2 组件内容嵌入(ng-content)

    一.简介 内容嵌入是组件的一个高级功能特性,使用组件的内容嵌入特性能很好地扩充组件的功能,方便代码的复用. 二.用法 如上,在模版中使用了<ng-content>标签,这个标签就是用来渲染 ...

  4. VS2010-MFC(MFC常用类:定时器Timer)

    转自:http://www.jizhuomi.com/software/232.html 前面一节讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考 ...

  5. day22_5-xml模块

    # 参考资料:# python模块(转自Yuan先生) - 狂奔__蜗牛 - 博客园# https://www.cnblogs.com/guojintao/articles/9070485.html ...

  6. ICPC 2019 徐州网络赛

    ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...

  7. error C2146: 语法错误: 缺少“;”(在标识符“CRC”的前面) ...\...\MyMethod.h

    错误原因:头文件的顺序错误,这种情况一般是因为dxsdk的头文件放在其他头文件前面了. 问题复现: 这里如果将#include <ReadDataThreadClass.h>放到最末尾就不 ...

  8. java 实现websocket(转)

    Java web项目使用webSocket   前端: <%@ page language="java" import="java.util.*" pag ...

  9. C++右值引用与转移语义

    std::forwad? C++11 中定义的 T&& 的推导规则为: 右值实参为右值引用,左值实参仍然为左值引用. 参考: 右值引用与转移语义

  10. [转].NET4.0新特性集合贴

    vs2010正式版4月12日发布了,前几天我也下了一个,但这几天都没有时间好好试用一下,今天针对C#语言的新特性使用了一下,感觉还不错,有几个新特性和大家分享一下,希望我没有太火星…… 一.新关键词— ...