组件&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. thinkphp 包含文件

    在当前模版文件中包含其他的模版文件使用include标签,标签用法: <include file='模版表达式或者模版文件1,模版表达式或者模版文件2,...' /> 博智达直线电机价格 ...

  2. agc38C LCMs

    https://atcoder.jp/contests/agc038/tasks/agc038_c 题意:给\(a_i\),求\(\sum_{i=1}^n\sum_{j=i+1}^nlcm(a_i,a ...

  3. POJ 2104:K-th Number 整体二分

    感觉整体二分是个很有趣的东西. 在别人的博客上看到一句话 对于二分能够解决的询问,如果有多个,那么如果支持离线处理的话,那么就可以使用整体二分了 树套树写了一天还是WA着,调得焦头烂额,所以决定学cd ...

  4. day 49 Bootstrap框架和inconfont、font-awesome使用

    Bootstrap框架和inconfont.font-awesome使用   iconfont的使用:https://www.cnblogs.com/clschao/articles/10387580 ...

  5. QString组合、拆分。

    1.组合字符常用arg()函数 QString test=QString("_haha_%1_hehe%2") .arg("ee").arg("aa& ...

  6. Windows与Linux获取进程集合的方法

    Windows: List<String> tasklist=new ArrayList<String>(); try { Process process = Runtime. ...

  7. Collection、Iterator、泛型初步

    java.util.Collection 集合层次的根接口 java.util.List extends Collection ArrayList implements List 常用方法 boole ...

  8. 第二篇:怕碰到是因为没掌握,来吧,zTree!

    一直以来看见web项目中的树就头疼.这次又给碰上了,什么也别说,这次自己整理一个版本出来实践一下.zTree v3.2的API界面非常清爽,但是在查看API之前,你需要自己先实践一下,知道基本的概念和 ...

  9. css实现文字内容超出显示省略号

    white-space: nowrap; /* 内容超出容器宽度时强制不换行 */ overflow: hidden; /* 内容超出容器时隐藏超出部分 */ text-overflow: ellip ...

  10. python代码打包成exe文件

    1.准备工作 1.安装pywin32.pyinstaller 2.准备好ico文件 找一个png格式的图片,使用png2ico脚本生成包含以下6个尺寸的ico文件:128×128 64×64 48×4 ...