组件允许你将Ui拆分为独立可复用的代码片段,并对每个片段进行独立构思。本指南只在介绍组件的相关概念。你可以参考详细组件 API

组件,从概念上类似与JavaScript函数。它接受任意的入参(既“props”),并返回用于描述页面展示内容的REACT元素。

函数组件与class组件

定义组件最简单的方式就是编写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里是等效的。

我们将在下一章节中讨论关于class的额外特性。在那之前,为了保持示例简单明了,将使用函数组件。

渲染组件

之前,我们遇到的REACT元素都只是DOM标签:

const element = <div />;

不过REACT元素也可以是用户自定义的组件:

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

当REACT元素为用户自定义组件时,它会将JSX所接收的属性转换为单个对象传递给组件,这个对象被称之为PROPS。

例如,这段代码会在页面渲染“Hello,Sara”:

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

让我们来回顾一下这个例子中发生了什么:

1、我们调用ReactDOM.render()函数,并传入<Welcome name="Sara"/>作为参数。

2、React调用Welcome 组件,并将{name:'Sara'}作为props传入。

3、Welcome组件将<h1>Hello,Sara</h1>元素作为返回值。

4、React DOM 将DOM高效地更新为<h1>Hello,Sara</h1>。

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

React 会将以小写字母开头的组件视为原生 DOM 标签。例如,<div /> 代表 HTML 的 div 标签,而 <Welcome /> 则代表一个组件,并且需在作用域内使用 Welcome。

你可以在深入 JSX中了解更多关于此规范的原因。

组合组件

组件可以在其输出中引用其他组件。这就可以让我们同一组件来抽象出任意层次的细节。按钮,表单,对话框,甚至整个屏幕的内容:在REACT应用程序中,这些通常都会以组件形式表示。

例如,我们可以创建一个可以多次渲染Welcome组建的APP组件:

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

通常来说,每个新的REACT应用程序的顶层组件都是APP组件。但是,如果你将REACT集成到现有的应用程序中,你肯能需要使用像Button这样的小组件,并自下而上地将这类组件逐步应用到视图层的每一处。

提取组件

将组件拆分为更小的组件。

例如,参考如下Comment组件:

function formatDate(date) {
return date.toLocaleDateString();
} 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>
);
} const comment = {
date: new Date(),
text: 'I hope you enjoy learning React!',
author: {
name: 'Hello Kitty',
avatarUrl: 'https://placekitten.com/g/64/64',
},
};
ReactDOM.render(
<Comment
date={comment.date}
text={comment.text}
author={comment.author}
/>,
document.getElementById('root')
);

该组件用于描述一个社交媒体网站上的评论功能,它接受author(对象),text(字符串)以及date(日期)作为props

该组件由于嵌套的关系,变得难以维护,且很难复用它的各个部分。因此,让我们从中提取一些组件出来。

首先,我们将提取Avatar组件:

function Avatar(props) {
return(
<img className="Avatar"
src={props.user.avatarUrl}
alt={props.user.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组件,该组件在用户名旁渲染Avatar组件:

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>
);
}

最初看上去,提取组件可能是一件繁重的工作,但是,在大型应用中,构建可复用组件库是完全值得的。根据经验来看,如果Ui中有一部分被多次使用(Button,Panel,Avatar),或者组件本身就足够复杂(APP,FeedStory,Comment),那么它就是一个可复用组件的候选项。

PROPS的只读性

组件无论是使用函数声明还是通过Class声明,都决不能修改自身的PROPS。来看下这个sum函数:

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

这样的函数被成为春函数,因为函数不会尝试更改入参,且多次调用下相同的入参始终返回相同的结果。

相反,下面的这个函数则不是纯函数,因为它更改了自己的入参:

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

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

所有REACT组件都必须像纯函数一样保护它们的PROPS不被更改。

当然,应用程序的UI是动态的,并会伴随时间的推移而变化。在下一章节中,我们将介绍一种新的概念,称之为“state”。在不违反上述规则的情况下,state允许REACT组件随用户操作、网络响应或者其他变化而动态更改输出内容。

组件&Props的更多相关文章

  1. 如何在Vue2中实现组件props双向绑定

    Vue学习笔记-3 前言 Vue 2.x相比较Vue 1.x而言,升级变化除了实现了Virtual-Dom以外,给使用者最大不适就是移除的组件的props的双向绑定功能. 以往在Vue1.x中利用pr ...

  2. vue2.0子组件修改父组件props数据的值

    从vue1.0升级至2.0之后 prop的.sync被去除 因此直接在子组件修改父组件的值是会报错的如下: 目的是为了阻止子组件影响父组件的数据那么在vue2.0之后 如何在子组件修改父组件props ...

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

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

  4. js 实现vue—引入子组件props传参

    参考:https://www.cnblogs.com/xiaohuochai/p/7388866.html 效果 html <!DOCTYPE html> <html> < ...

  5. React 组件&Props

    组件&Props 组件&Props 组件可以将UI切分成一些独立的.可复用的部件,这样你就只需要专注于构建每一个单独的组件. 组件从概念上看就像是函数,它可以接受任意的输入值(称之为& ...

  6. 子组件props接受父组件传递的值 能修改吗?

    vue2.0 子组件props接受父组件传递的值,能不能修改的问题整理 父组件代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  7. Vue2.0 【第二季】第7节 Component 组件 props 属性设置

    目录 Vue2.0 [第二季]第7节 Component 组件 props 属性设置 第7节 Component 组件 props 属性设置 一.定义属性并获取属性值 二.属性中带' - '的处理方式 ...

  8. vue watch 可以监听子组件props里面属性的改变

    子组件watch 可以监听其props里面属性的改变 当changeFather导致calm改变时,会执行console.log('props change');

  9. Vuejs——(9)组件——props数据传递

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   本篇资料来于官方文档: http://cn.vuejs.org/guide/components ...

  10. Vue 父组件ajax异步更新数据,子组件props获取不到

    转载 https://blog.csdn.net/d295968572/article/details/80810349 当父组件 axjos 获取数据,子组件使用 props 接收数据时,执行 mo ...

随机推荐

  1. 【WPF】1、 基本控件的简介

    WPF一直都是断断续续的使用.偶尔用到一下.但是每次间隔比较长,需要重新学习,就写了这篇日志.以后有问题,看这个就可以了解各大概,然后针对细节再另外想办法. 微软的东西真心好,如果什么都不懂,可以直接 ...

  2. 一次golang应用的docker部署经历

    开发平台win10,服务器centos7.5 编写dockerfile # scratch 为空镜像,因为golang的build的可执行文件不需要什么环境 FROM scratch # 作者署名 M ...

  3. 指针 vs 引用 (2)

    这波要针对上篇分析里 标红的问题(成员变量用 T,T&啥情况)继续思考, 要学习以下材料: 1. 知乎上:用指针还是引用 2. StackOverflow上的相关问题 https://stac ...

  4. nc 从服务器上传下载文件

    1.安装 nc # yum install nc -y 2.下载文件 // 在 45.77.17.128 这台主机监听 9988 端口(注意符号是 "<" ) # nc -l ...

  5. IDEA新建一个Spring Boot项目

    Maven构建项目模板 maven构建的是maven风格的纯净模板,要转变成spring boot项目需要自己添加依赖等配置. mvn archetype:generate: Maven插件原型是一个 ...

  6. Java 数组(二)基本操作

    一.数组的基本操作 1.数组遍历[重点] 数组遍历:就是将数组中的每个元素分别获取出来,就是遍历.遍历也是数组操作中的基石.  方式一:使用索引下标方式 int[] array = { 15, 25, ...

  7. powershell 远程下载并执行

    远程下载文件到本地并执行cmd.exe /c powershell.exe -ExecutionPolicy bypass -noprofile -windowstyle hidden (new-ob ...

  8. 浅析ORACLE ERP系统维护方法

    笔者曾从事ORACLE ERP系统客户服务工作多年,在ERP系统维护工作中,深深体会到:ERP的系统维护工作看似平常,实则大有学问. ORACLE ERP系统是一个大型集成的软件系统,是一个企业全面共 ...

  9. Redis系列-第六篇哨兵模式

    https://blog.csdn.net/niugang0920/article/details/97141175 Redis的主从复制模式下, 一旦主节点由于故障不能提供服务, 需要人工将从节点晋 ...

  10. prometheus学习系列九: Prometheus AlertManager使用

    在Prometheus的报警系统中,是分为2个部分的, 规则是配置是在prometheus中的, prometheus组件完成报警推送给alertmanager的, alertmanager然后管理这 ...