Component(组件)可以是类组件(class component)、函数式组件(function component)。

1、类组件:

通常情况下,我们会使用ES6的class关键字来创建React组件。

a、类组件分为普通类组件(React.Component)以及纯类组件(React.PureComponent)。

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

b、React.Component和React.PureComponent区别

先了解下React生命周期函数shouldComponentUpdate,这个函数返回一个布尔值,如果返回true,那么当props或state改变的时候进行更新;如果返回false,当props或state改变的时候不更新,默认返回true。这里的更新不更新,其实说的是执不执行render函数,如果不执行render函数,那该组件和其子组件都不会重新渲染。

区别:

  • 1、继承PureComponent时,不能再重写shouldComponentUpdate
  • 2、React.PureComponent基于shouldComponentUpdate做了一些优化,通过prop和state的浅比较来实现shouldComponentUpdate,也就是说,如果是引用类型的数据,只会比较是不是同一个地址,而不会比较具体这个地址存的数据是否完全一致。
class ListOfWords extends React.PureComponent {render() {return <div>PureComponent渲染结果:{this.props.words.join(',')}</div>;}
}
class WordAdder extends React.Component {constructor(props) {super(props);this.state = {words: ['marklar']};this.handleClick = this.handleClick.bind(this);}handleClick() {// This section is bad style and causes a bugconst words = this.state.words;words.push('marklar');this.setState({words: words});}render() {// slice() 方法返回一个新的数组对象return (<div><button onClick={this.handleClick}>click</button><div>Component渲染结果:{this.state.words.join(',')}</div><ListOfWords words={this.state.words} /><ListOfWords words={this.state.words.slice(0)} /></div>);}
}
ReactDOM.render(<WordAdder />,document.getElementById('root')
);复制代码

在 CodePen 上尝试。

2、函数式组件:

一个函数就是一个组件,return一份DOM解构
特点:
1.没有生命周期,也会被更新并挂载,但是没有生命周期函数
2.没有this(组件实例)
3.没有内部状态(state)
优点 :轻量,如果你的组件没有涉及到内部状态,只是用来渲染数据,那么就用函数式组件,性能较好。复制代码
// functional component
function Welcome(props) {return <h1>Hello, {props.name}</h1>;
}复制代码
//组合组件
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')
);复制代码

3、函数式组件与基于Class声明的组件比较

  • 不需要声明类,可以避免大量的譬如extends或者constructor这样的代码

  • 不需要显示声明this关键字,在ES6的类声明中往往需要将函数的this关键字绑定到当前作用域,而因为函数式声明的特性,我们不需要再强制绑定。

  • 更佳的性能表现:因为函数式组件中并不需要进行生命周期的管理与状态管理,因此React并不需要进行某些特定的检查或者内存分配,从而保证了更好地性能表现。

const Text = (props) =><p>{props.children}</p>;class App extends React.Component {render() {return <Text>Hello World</Text>;}
}
ReactDOM.render(<App />,document.getElementById('root')
);复制代码

在 CodePen 上尝试。

转载于:https://juejin.im/post/5c0dfa265188257a5a2514d6

React(二):类组件、函数式组件相关推荐

  1. [react] 什么是React的实例?函数式组件有没有实例?

    [react] 什么是React的实例?函数式组件有没有实例? React的实例:通过继承React.Component的类生成 函数式组件没有实例 个人简介 我是歌谣,欢迎和大家一起交流前后端知识. ...

  2. 初步了解react-babel-虚拟DOM-JSX-类组件-函数式组件

    一 初步了解React 需要理解的概念有: 什么是六何分析法? 利用六何分析法剖析 React 如何查看哪些项目是用 reactjs 进行开发的 学习 ReactJs 常用的 JavaScript 语 ...

  3. 为什么react选择了函数式组件(剖析原理)

    不好意思,这是知乎上我写的文章,就不再csdn发布了.如果需要阅读,请点击: 为什么react选择了函数式组件(剖析原理) 最近,发现知乎的连接出问题了,所以,暂时把内容放在此处.如果知乎上好了的话, ...

  4. react中函数式组件React Hooks

    React Hooks 函数式组件 使用hooks理由 高阶组件为了复用,导致代码层级复杂 生命周期的复杂 写成functional组件,无状态组件,因为需要状态,又改成了class,成本高 在16. ...

  5. React基础(貳)———组件

    一.组件 类组件 函数式组件 组件的嵌套 /*** rcc快捷键**/ import React, { Component } from "react";class Child e ...

  6. vue中的render函数、h()函数、函数式组件

    一.什么是render 官网:用于编程式地创建组件虚拟 DOM 树的函数. 在我们使用webpack脚手架创建项目时,都能在main.js中看到一个render函数 import Vue from ' ...

  7. vue的函数式组件functional

    vue的函数式组件没怎么使用,所以可能不是很了解,所以,就花点时间大致了解下,算是对此有大概印象,其实它就是个函数而已,感觉与react的无状态组件有点像,特此做记录下. 首先vue的函数式组件fun ...

  8. [react] 类组件和函数式组件有什么区别?

    [react] 类组件和函数式组件有什么区别? 函数式组件没有state和一系列的钩子函数,只接收一个props 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大 ...

  9. react讲解(函数式组件,react hook)

    文章目录 前言 一.函数式组件 理解: 作用 代码示例: 函数组件注意事项 二.React hook React Hooks 优势 Hook 使用规则 2.常用的hook useState useEf ...

最新文章

  1. 赋能AI开源生态,Tengine成AI开发利器
  2. 武大首位女院士逝世,国际再生资源领域最高奖中国第一人,享年80岁
  3. 架构师之路 — 部署架构 — 高可用集群 — N+1 高可用模型
  4. Matplotlib实例教程(十四)误差条形图
  5. VirtualBox中ubantu虚拟机与主机进行复制粘贴
  6. python开发接口故障码_Python代码样例
  7. C语言--课程管理信息系统
  8. c语言输出图形之小飞机
  9. Readyboost技术U 盘变内存,加速电脑(只针对Windows 7和Vista系统)
  10. android 强制卸载app,怎么强制删除安卓手机自带软件(三招就能卸载干净)
  11. nodejs调用阿里云盾身份证二要素验证
  12. Windows 10 上使用 CMake GUI 编译 Krita 源代码并使用 MinGW 64 作为构建工具
  13. 树莓派的linux操作系统,树莓派的6种轻量级操作系统介绍
  14. 一维数组——折半查找法
  15. IP67 | IP58 防护等级理解
  16. execve系统调用_进程调度之 4:系统调用execve
  17. 鼠标经过图片 图片放大缩小
  18. 第一次作业:幻想科技
  19. 南方科技大学计算机系优秀毕业生,南科大2020届本科十佳毕业生评选结果揭晓...
  20. 商场/购物中心会员营销活动方案

热门文章

  1. httpclient妙用一 httpclient作为客户端调用soap webservice(转)
  2. Linux 中 SVN 重启关闭
  3. 解决win7下netbeans安装的错误问题
  4. 可视化图形(二):热力图-imshow()
  5. PHP 入门 - 9.安全
  6. CSS clear 清除浮动,兼容各浏览器
  7. PHP修改PHP.ini上传大文件的解决办法
  8. opencv,用摄像头识别贴片元件的定位和元件的角度(转载)
  9. linux学习笔记-9.查找
  10. docker tomcat jvm 使用 visualVM监控