函数式组件和类组件的区别

ops/2024/11/18 7:11:25/

函数式组件和类组件的区别

  • 函数式组件和类组件的区别
    • 1. 语法
    • 2. 状态管理
    • 3. 生命周期管理
    • 4. this
    • 5. 创建组件
    • 6. 继承
    • 7. 性能优化
  • 为什么推荐使用函数式组件
  • 函数式组件的优势

函数式组件和类组件的区别

1. 语法

  • 函数式组件:基于函数式编程思想,使用 函数 定义。接受props作为参数,直接返回React元素。
  • 类组件:基于面向对象编程思想,使用 ES6的class 定义,继承自React.Component,使用render()方法返回React元素。

2. 状态管理

  • 函数式组件:最初是无状态管理,但引入React Hooks(如useState或useReducer)后,可以通过 useState 管理状态。
  • 类组件:通过 this.statethis.setState 来管理状态。

3. 生命周期管理

  • 函数式组件:通过 useEffect 和其他 Hooks 来模拟生命周期。
  • 类组件:自身有很多的生命周期钩子函数(如componentDidMountcomponentDidUpdatecomponentWillUnmount等),使得组件在特定时期可以执行特定操作

4. this

  • 函数式组件:没有 this 。
  • 类组件:有this,可以使用this关键字来访问组件的属性和方法

5. 创建组件

  • 函数式组件:创建组件时,只需调用函数即可。这种方式更加简洁和高效,避免了类组件中的实例化过程。
  • 类组件:创建组件时,要先实例化一个对象,然后通过实例化对象调用 render 函数来创建组件。这增加了代码的复杂性和执行时间。

6. 继承

  • 函数式组件:不能继承
  • 类组件:由于类本身的原因,类组件是可以实现继承的。
    react并不是很推荐继承原有的组件,因为继承的灵活性比较差,存在性能、复杂性等问题,更推荐使用组合而不是继承。

7. 性能优化

  • 函数式组件:使用 React.memo 可以避免不必要的渲染,通过对props进行浅比较,如果props没有变化,则不会重新渲染组件。
  • 类组件:通过 shouldComponentUpdate 生命周期方法来避免不必要的渲染,通过手动比较前后props和state,来决定是否需要重新渲染。也可以通过 PureComponent 来自动进行props和state的浅比较,类似于React.memo的效果。

为什么推荐使用函数式组件

在 React 早期,函数式组件主要用于渲染,没有状态管理或生命周期方法。但自从引入了 Hooks,函数式组件可以达到和类组件类似的功能,而且代码更加轻量简洁,提供了更细粒度的逻辑组织和复用,更易于优化。但是,对于需要明确生命周期或继承的复杂组件的特定场景下也是推荐使用类组件的。

函数式组件的优势

  1. 简洁性:函数式组件没有构造函数,生命周期
  2. Hooks:通过 Hooks,函数式组件可以拥有状态和生命周期等特性。
  3. 没有this:在函数式组件中,没有 this 的绑定问题,这使得代码更易于理解和维护。
  4. 更好的代码组织:hooks将相关的逻辑组织在一起,而不是分散在类的不同方法中。
  5. 更好的性能:每次渲染时不需要创建新的实例,还可以使用React.memo、useCallback 和 useMemo 等 Hooks 来防止不必要的渲染和缓存计算结果

http://www.ppmy.cn/ops/134643.html

相关文章

c语言学习21数组

1.1数组介绍 概念:数组就是 相同数据类型 的一组数据的集合 数组中每个数据 元素 用一个名字来命名这个集合 数组名 用编号区分 下表(从0开始自动标号) 当处理大量…

Unreal engine5实现类似鬼泣5维吉尔二段跳

系列文章目录 文章目录 系列文章目录前言一、实现思路二、具体使用蓝图状态机蓝图接口三、中间遇到的问题 前言 先看下使用Unreal engine5实现二段跳的效果 一、实现思路 在Unreal Engine 5 (UE5) 中使用蓝图系统实现类似于《鬼泣5》中维吉尔的二段跳效果,可以通…

IDEA报包不存在,但实际存在

IDEA版本2024.2.1 现象 在IDEA里启动运行项目,报某个类有问题,引入的包不存在。 点击这个引入的包,可以看到它在左侧外部库里存在。 试过的无效方法 双击ctrl,在弹出框中mvn idea:idea在文件里,清空缓存并重启在右…

⽂件内容的读写

文件 InputStream (字节流读出 抽象类) InputStream 只是⼀个抽象类,要使⽤还需要具体的实现类 FileInputStream(字节流读出) OutputStream(字节流写入) Reader(字符流读入&#xff…

vue2和vue3:diff算法的区别?

Vue 2 和 Vue 3 在 diff 算法方面的主要区别是: Vue 2 使用普通的 diff 算法,它会遍历所有的节点进行比对。 Vue 3 引入了 patch flag 的概念,并且对 diff 算法进行了优化,比如在相同层级的节点间不会去递归比对已经被移除的节点…

023、ELK 从入门到实践

ELK 从入门到实践 第一章:ELK基础概念 1.1 为什么需要ELK? 传统日志处理的痛点 日志分散 应用部署在不同服务器需要逐个登录查看无法统一管理 查询困难 只能用grep等命令无法复杂检索分析效率低 展示受限 纯文本格式无法可视化难以直观展示 ELK的解决方案 集…

iOS 键盘弹出视图精准上移

1 视图精准位移,需要计算出输入框距离屏幕底部的距离,然后 计算出输入框需要上移的距离,就是整个视图需要上移的距离, 注意,我们可以自行设置一个适当的buffer,我这里是40,就是输入框距离 键盘有一个40的距离&#xf…

Angular框架:构建现代Web应用的全面指南

文章目录 前言一、Angular简介二、Angular的核心特性三、Angular的应用场景四、Angular的发展趋势五、如何开始使用Angular结语 前言 在当今高度竞争的互联网环境中,构建高效、响应迅速且易于维护的Web应用成为企业成功的关键。Angular框架以其强大的功能、灵活的架…