React性能优化API

news/2024/11/20 21:29:26/

一、常见性能优化API

  1. shouldComponentUpdate:通过重写该函数实现组件的条件渲染,即只有在组件的 props 或 state 发生变化时才重新渲染组件。

  2. PureComponent:React 自带的一个纯组件,其 shouldComponentUpdate 函数已经被自动实现,只有在 props 或 state 发生变化时才会重新渲染组件。

  3. memo:类似于 PureComponent,但是用于函数式组件,可以使其只在 props 发生变化时重新渲染。

  4. React.memo:类似于 memo,但是用于包裹组件,可以使其只在 props 发生变化时重新渲染。

  5. useCallback 和 useMemo:两个 hooks 函数,用于缓存函数和计算结果,避免重复计算或渲染。

二、使用案例

  • shouldComponentUpdate
    通过对比当前组件的state、props与下次渲染的做比较,确认是否re-render
class MyComponent extends Component {shouldComponentUpdate(nextProps, nextState) {return nextState.count !== this.state.count;// true 更新、false 不更新}
}
  • PureComponent
    在组件内部自行实现了shouldComponentUpdate方法,但要注意仅会做浅层比较,复杂的state、props需要自己进行对比
import React, { PureComponent } from 'react';
class MyComponent extends PureComponent {
}
  • React.memo(memo)
    在高版本或hooks中的纯组件的优化方案,可以理解是PureComponent的高版本实现,仅对比prop
import React from 'react';function MyComponent(props) {  
}
export default React.memo(MyComponent);
  • useCallback、useMemo
    缓存计算结果、与回调函数,避免重复计算与定义
    useMemo类似Vue中的watch
    useCallback等于useMemo对方法的返回
import React, { useState, useCallback, useMemo } from 'react';function MyComponent(props) {const [count, setCount] = useState(0);const handleClick = useCallback(() => {setCount(count + 1);}, [count]);const doubledCount = useMemo(() => {console.log('doubledCount called');return count * 2;}, [count]);console.log('render called');return (<div><p>The count is: {count}</p><p>The doubled count is: {doubledCount}</p><button onClick={handleClick}>Click me</button></div>);
}export default MyComponent;

三、差异对比

  • class组件、函数组件
    在这里插入图片描述
  • memo、useMemo、useCallBack
memouseMemouseCallback
作用函数式组件优化计算函数式组件值缓存回调函数
参数组件计算函数、依赖项数组回调函数、依赖项数组
返回值优化后的组件计算结果缓存后的回调函数
使用方式export default memo(MyComponent)const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b])const memoizedCallback = useCallback(() => doSomething(a, b), [a, b])

Tips:useMemo(()=> fn) 等价于 useCallback(fn)


http://www.ppmy.cn/news/404402.html

相关文章

验证attention是否在图像分类问题上起决定性作用

来源&#xff1a;投稿 作者&#xff1a;摩卡 编辑&#xff1a;学姐 Motivation 现阶段出现了大量的Transformer-style图像分类模型&#xff0c;并且这些模型在ImageNet上取得了不俗的成绩&#xff0c;这些Transformer-style模型将取得高性能的功劳归功于Multi-head attention注…

【实战】 项目起航:项目初始化与配置 —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(一)

文章目录 一、项目起航&#xff1a;项目初始化与配置1.项目初始化 —— create-react-app2.格式化 —— Prettier3.提交规范 —— commitlint4.Mock —— json-server 学习内容来源&#xff1a;React React Hook TS 最佳实践-慕课网 相对原教程&#xff0c;我在学习开始时&am…

MySQL----索引

文章目录 一、索引的概念二、索引的作用索引的副作用创建索引的依据 三、索引的分类和创建3.1普通索引创建直接索引修改表方式创建创建表的时指定索引&#xff08;不推荐使用&#xff09; 3.2唯一索引直接创建唯一索引修改表方式创建创建表时指定 3.3主键索引创建表的时指定修改…

【数据库三】MySQL事务

MySQL事务 1.事务的概念2.事务的ACID特点3.知识点总结 1.事务的概念 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体&#xff0c;一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#x…

【C++进阶】带你手撕AVL树

文章目录 一、什么是AVL树二、AVL树的定义三、AVL树的插入1.理论讲解2.代码实现 四、AVL树的旋转1.左单旋2.右单旋3.左右双旋4.右左双旋 五、 AVL树的验证六、完整源码 一、什么是AVL树 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为…

Pinia:Vue.js状态管理的下一代

引言 在现代Web应用程序开发中&#xff0c;状态管理是一个不可或缺的部分。Vue.js是一种流行的前端框架&#xff0c;它提供了Vuex作为其默认的状态管理解决方案。然而&#xff0c;随着Vue社区的不断壮大和进步&#xff0c;我们迫切需要一个更简单、更直观的状态管理库。这就是…

C#开发的OpenRA游戏之建造物品的窗口3

C#开发的OpenRA游戏之建造物品的窗口3 前面已经分析TAB窗口来分类管理不同物品的创建,主要分为5大类,但是这5大类是怎么样实现显示的呢,下面就来分析这个问题。 先来看一下类ProductionTabsWidget的构造函数: public ProductionTabsWidget(World world) { this.worl…

观察者模式(二十)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了迭代器模式(十九), 如果没有看过, 请观看上一章 一. 观察者模式 引用 菜鸟教程里面 观察者模式介绍: https://www.runoob.com/design-pattern/observer-pattern.html 当对象间存在一对多关系时&#xff0c;则使用观察…