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组件的区别 的相关文章

  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • Three.js:缩放几何图形后错误的 BoundingBox

    在我的场景中 我有一个简单的立方体 var test new THREE Mesh new THREE CubeGeometry 10 10 10 new THREE MeshBasicMaterial scene add test 该立方
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 使用 JavaScript 禁用第三方 cookie

    我正在努力根据所有在欧盟运营的公司的数据保护规则实施新的 Cookie 政策合规性 根据该规则 用户在使用任何网站时必须能够拒绝 接受除必需的 Cookie 之外的所有内容 在我客户的网站中 我可以看到正在存储以下第三方 cookie ga
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 如何针对 Node.js 中发生的每个错误发送电子邮件?

    假设我的 node js 应用程序正在运行 如果出现错误 我的意思是所有错误 不仅仅是网络错误 如果出现错误 则很重要 我如何调用函数向我发送电子邮件 基本上 在我希望它写入 err out 之前 我希望向我发送一封电子邮件 我正在使用no
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • 有没有办法使用 Rspec/Capybara/Selenium 将 javascript console.errors 打印到终端?

    当我运行 rspec 时 是否可以让 capybara selenium 向 rspec 报告任何 javascript console errors 和其他异常 我有一大堆测试失败 但当我手动测试它时 我的应用程序正在运行 如果不知道仅在
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • DataTables row.add 到特定索引

    我正在替换这样的行项目 var targetRow entity row dataTable targetRow closest table dataTable DataTable dataTable row targetRow remov
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea

随机推荐

  • 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