react 函数组件和class组件的区别

2023-11-07

一、组件的定义 

1.class组件:继承React.Component,且需要创建render方法来返回元素。

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

 2.函数组件

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

或者

const Welcome = (props) => {
  return <h1>Hello, {props.name}</h1>;
}

二、state的定义、读取、修改方式 

1. class组件

1) 定义:在constructor中定义(构造函数是唯一可以给 this.state 赋值的地方)

constructor(props) {
    super(props);
    this.state = {count: 0};
}

2) 通过this.state读取

<button>{this.state.count}</button>

3) 通过this.setState()修改数值 (它更新 state 变量总是合并它)

接收一个函数

this.setState((state, props) => ({
  count: state.count + props.increment
}));

接收一个对象

this.setState({count: 2});

2. 函数组件

1)定义:用hook直接定义变量和方法

const [count, setCount] = useState(0);

2)直接读取

<p>You clicked {count} times</p>

3)通过setCount()方法修改数值 ( 它更新 state 变量总是替换它   ;已经有了 setCount 和 count 变量,所以我们不需要 this

<button onClick={() => setCount(count + 1)}>
    Click me
</button>

三、副作用操作的执行与生命周期 

副作用操作:在 React 更新 DOM 之后运行一些额外的代码。

1. class组件(有生命周期

由于我们希望在react更新dom以后执行操作,所以不会把副作用操作放在render函数中,而是放在生命周期 componentDidMount 和 componentDidUpdate 函数中。

但有时候,我们希望在组件加载和更新时执行同样的操作,所以需要在 componentDidMount 和 componentDidUpdate 中同时调用同一个方法。

componentDidMount() {
  document.title = `You clicked ${this.state.count} times`;
}

componentDidUpdate() {
  document.title = `You clicked ${this.state.count} times`;
}

2. 函数组件(无生命周期

函数组件没有生命周期,其副作用操作使用useEffect执行。useEffect 会在每次渲染后都执行。

(生命周期函数是React.Component类的方法实现,函数式组件没有继承React.Component,所以没有生命周期函数。)

四、关于this 

1.class组件:需要有this

1)组件传值获取方式:从this中取

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

2)事件的处理:需要绑定this

比如:用箭头函数绑定

class LoggingButton extends React.Component {
    // 此语法确保 `handleClick` 内的 `this` 已被绑定。
    // 注意: 这是 *实验性* 语法。
    handleClick = () => {
      console.log('this is:', this);
    }

    render() {
      return (
        <button onClick={this.handleClick}>
          Click me
        </button>
      );
    }
}

再比如:在构造函数内绑定

class LoggingButton extends React.Component {
    constructor(props) {
      super(props);  
      // 为了在回调中使用 `this`,这个绑定是必不可少的
      this.handleClick = this.handleClick.bind(this);
    }
    handleClick() {
        console.log('this is:', this);
    }


    render() {
      return (
        <button onClick={this.handleClick}>
          Click me
        </button>
      );
    }
}


2. 函数组件:无this

1)组件传值获取方式:无this,从传入的参数中取

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

2)事件的处理:直接调用

function LoggingButton() {
  function handleClick(e) {
    e.preventDefault();
    console.log('The link was clicked.');
  }

  return (
    <a href="#" onClick={handleClick}>
      Click me
    </a>
  );
}

五、关于实例

1. class组件

class组件有实例

2. 函数组件

函数组件没有实例。由于没有实例,它不能使用ref属性。但可以在函数组件内部使用 ref 属性,只要它指向一个 DOM 元素或 class 组件。

 

六、使用选择

由于 class 组件 的使用需要了解  this 的工作方式, 还不能忘记绑定事件处理器,也没有稳定的语法提案,且不能很好的压缩,并且会使热重载出现不稳定的情况...

所以react开发人员建议使用函数组件,并推出hook来增强函数组件功能。

七、总结

1. 组件定义方式不同;

2. (因为组件定义方式不同)生命周期不同:class组件有,函数组件无;

3. (因为生命周期不同)副作用操作执行不同:class组件通过生命周期函数,函数组件用hook的useEffect;

4. state的定义、读取、修改方式不同:函数组件用hook的useState;

5. this:class组件有,函数组件无;

6. 实例:class组件有,函数组件无;

7. (因为实例不同)ref使用不同:class组件有,函数组件无;

8. 使用上: 官方推荐函数组件。

  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react 函数组件和class组件的区别 的相关文章

随机推荐

  • OpenCV学习笔记——《基于OpenCV的数字图像处理》

    源码下载 下载资源包 bookln cn 常用函数库 英文 OpenCV OpenCV modules 中文 Welcome to opencv documentation OpenCV 2 3 2 documentation jetson
  • esp8266-01s介绍与使用

    esp826601s 是个比较常用的wifi模块 体积小 功能强大 说是可以用于工业 下面介绍esp826601s 可用引脚 以及可用功能 esp 01 ESP 01S 在ESP 01的基础上 优化了PCB天线 进行了一小步的升级 带来了一
  • label smooth的pytorch实现以及其公式推导(虽然短但是细)

    标签平滑 label smooth 标签平滑是一种正则化手段 目的为了解决onehot编码的缺陷 减少过拟合问题 在各种竞赛中广泛使用 涨点神器 假设 预测的结果为 y p r e d
  • elasticsearch常用命令

    curl X REST风格的语法谓词 节点ip 节点端口号 默认9200 索引名 索引类型 操作对象的ID号 curl localhost 9200 cat cat allocation cat shards cat shards inde
  • 小甲鱼零基础入门学习python笔记

    小甲鱼老师零基础入门学习Python全套资料百度云 包括小甲鱼零基础入门学习Python全套视频 全套源码 全套PPT课件 全套课后题及Python常用工具包链接 电子书籍等 请往我的资源 https download csdn net d
  • 说说看板在项目中的应用

    1 关于项目 1 1 概述 在任何组织中 项目其实就是一件需要大家共同努力配合完成的事情 且最后生产出的事物 是可以供他人长期使用的 好比一个蚁群 有蚁后 也有默默无闻的蚁兵们 蚁后负责命令大家搬食物 先搬这块再搬那块 蚁兵负责搬 大家排成
  • 延时消息队列

    目录 前言 一 延时队列实用场景 二 DelayQueue DelayQueue的实现 使用延迟队列 DelayQueue实现延时任务的优缺点 三 RocketMQ 原理 四 Kafka 原理 实现 DelayMessage定义 消息发送代
  • Linux中通过镜像搭建yum源

    上传镜像 首先 我们要给做实验的快照虚拟机配置好网络 并重启网络服务 当虚拟机的硬盘空间足够时 可以将真机的镜像文件直接发到虚拟机中 新建挂载目录进行挂载 我们将真机中的镜像发到快照中 但是提示空间不足 所以我们需要先删除发送到虚拟机上的镜
  • 非极大值抑制 nms

    非极大值抑制 Non max suppression 非极大值抑制 简称为NMS算法 英文为Non Maximum Suppression 其思想是搜素局部最大值 抑制极大值 非极大值抑制 在计算机视觉任务中得到了广泛的应用 例如边缘检测
  • Java_集合之Stack类的使用

    一 认识Stack 顾名思义 Stack代表是栈 栈是一种常用的数据结构 只能栈头插入元素 也只能从栈头出栈 遵循先进后出原则 栈好比手枪上弹夹的过程 最开始上的子弹会被压在最下面 最晚上的子弹反而最先被打出去 二 Stack类的使用 我们
  • 刷脸支付选择有软件开发能力的公司

    目前来说支付方式再次发生改变 从原本的扫码支付开始向着刷脸支付转变 因此作为企业商家就需要委托刷脸付款设备公司来定制优秀的刷脸支付系统和设备 而今天就请掌优技说说该如何选择这类公司 现在有很多刷脸付款设备公司 企业商家在选择时应该先把技术和
  • bwlabel函数的C语言实现及用法解析

    bwlabel函数的C语言实现及用法解析 在图像处理的领域中 连通区域标记是一项非常重要的技术 在C语言中 我们可以使用bwlabel函数来实现这个功能 本文将介绍bwlabel函数的实现原理和用法 并通过示例代码来演示其功能 bwlabe
  • 虚函数表详解

    一 概述 为了实现C 的多态 C 使用了一种动态绑定的技术 这个技术的核心是虚函数表 下文简称虚表 本文介绍虚函数表是如何实现动态绑定的 二 类的虚表 每个包含了虚函数的类都包含一个虚表 我们知道 当一个类 A 继承另一个类 B 时 类A会
  • 机器视觉软件工程师的生活是怎样的?

    大家好 本人是刚刚入职的视觉工程师 现在已经一年了 也给大家分享一下在这一段时间里 我做了什么 以及学到了什么 对了 虽然我只做了两个月的视觉工程师 但是我已经连续写了12年的日记了 我想把这个好习惯一直延续下去 也算是做个记录 可能没有人
  • c++多态及虚函数表内部原理实战详解

    1 多态实现方式 c 的多态机制主要是靠虚函数来实现 具体来说 就是用父类的指针指向子类的实例 然后通过父类指针调用子类对象中的成员函数 这样 就实现了父类指针的 多态 想了解虚函数实现机制 就必须先了解对象的存储方式 2 类的存储方式 我
  • python span标签的text属性_python + selenium 获取标签文本的为空解决办法

    一 确定元素是否被隐藏 link driver find element By xx value is displayed print link 如果输出结果为False 说明元素被隐藏了 二 解决方法 1 修改当前定位元素方式方法 修改定
  • 使react组件重新渲染的三种方式

    1 setState 2 props发生变化 3 forceUpdate
  • 目前最大的人像抠图数据集P3M-10k开源了!助力隐私保护的人像抠图研究

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt CV 微信技术交流群 转载自 京东探索研究院 人像抠图 是指从人物图像中提取人物前景 是计算机视觉领域的基础研究问题之一 1 2 3 4 8 在下游任务
  • 基于vmdk文件创建虚拟机

    基于vmdk文件创建虚拟机 1 准备vmdk文件 下载地址如下 链接 https pan baidu com s 1coQuZw8cgg5oU5bSegsS7Q pwd 5mv0 提取码 5mv0 账号 密码 root sinzuo 2 创
  • react 函数组件和class组件的区别

    一 组件的定义 1 class组件 继承React Component 且需要创建render方法来返回元素 class Welcome extends React Component render return h1 Hello this