• useEffect:会在组件渲染完毕后执行,和渲染无关的副作用。
  • useMemo:会在在组件首次加载和重渲染期间执行,执行的函数需要和渲染相关的。
  • useCallback:会在渲染期间执行,返回一个函数。

一、区别

  1. useCallback 和 useMemo 的参数跟 useEffect 一致,他们之间最大的区别有是 useEffect 会用于处理副作用,而前两个hooks不能。
  2. useCallback 和 useMemo 都会在组件第一次渲染的时候执行,之后会在其依赖的变量发生改变时再次执行。
  3. 并且这两个hooks都返回缓存的值,useMemo 返回缓存的 变量,useCallback 返回缓存的 函数。
  4. 如果没有提供依赖项数组,useMemo 在每次渲染时都会计算新的值。
  5. React.useMemo将调用fn函数并返回其结果,而React.useCallback将返回fn函数而不调用它:useCallback(fn, deps) 相当于 useMemo(() => fn, deps)。
  6. useMemo缓存的变量所代表的意义不是组件的state,组件的state改变会触发组件重渲染,而useMemo缓存的变量可能会因state改变而改变,是“被动的”;

二、使用场景

function App() {const [name, setName] = useState('')const getName = () => {console.log('getName-----')if (name === '') {return "张三"} else {return name}}return (<div className="App"><p>名称:</p><p>{getName()}</p><p onClick={() => setName('哈哈')}><button>改变Name</button></p></div>);
}<p>{name}</p><p onClick={() => setName('哈哈')}><button>改变Name</button></p></div>);
}

getName()会在每次组件渲染的时候执行dom,尽管name没有变化,我们需要让name变化的时候才渲染dom,否则保持原有的数据,这时候就用到了useMemo。

三、使用useMemo改造

function App() {const [name, setName] = useState('')const getName = useMemo(() => {console.log('useMemo-----')if (name === '') {return "张三"} else {return name}},[name])return (<div className="App"><p>名称:</p><p>{getName}</p><p onClick={() => setName('哈哈')}><button>改变Name</button></p></div>);
}

四、使用场景区别

  • useCallback 对于子组件渲染优化,当做函数传递时候。
  • useMemo 对于当前组件高开销的计算优化。

参考示例:https://www.e-learn.cn/topic/2694248​​​​​​​

useEffect、useMemo、useCallback使用场景分析相关推荐

  1. mysql表分区占用存储_MySQL 分区分表应用场景分析和分区中可能遇到的坑点

    MySQL的分区和分表应用场景分析 在日常工作中当我们的某张表的数据量过大的时候,首当其冲的可能就是进行分区和分表,但是是如何分区或者分表都要结合一点的业务场景下进行分析,才会显著的提升性能,来聊一聊 ...

  2. 如何调整按钮里的文字的位置android_UI设计中按钮场景分析

    别无他话,今天就和大家聊一聊设计宿敌--按钮设计.按钮的设计看似简单,其实按钮的功能不同,设计形式上也会有差异,今天我就针对按钮的场景分析,对按钮进行全面的解析. 按照功能性分类,按钮主要包括行为召唤 ...

  3. 电商抢购秒杀系统的设计_1_应用场景分析

    2019独角兽企业重金招聘Python工程师标准>>> 电商抢购秒杀系统的设计_1_应用场景分析 概述 所谓知已知彼,百战不殆,在开始详细介绍实战中的抢购秒杀系统时,我们了解一些抢购 ...

  4. spring bean scope作用域及多线程安全问题场景分析

    2019独角兽企业重金招聘Python工程师标准>>> Scope作用域 在 Spring IoC 容器中具有以下几种作用域: singleton:单例模式,在整个Spring Io ...

  5. mysql 事务 查询 范围加锁_MySQL死锁系列-常见加锁场景分析

    本文我们就从原理走向实战,分析常见 SQL 语句的加锁场景.了解了这几种场景,相信小伙伴们也能举一反三,灵活地分析真实开发过程中遇到的加锁问题. 如下图所示,数据库的隔离等级,SQL 语句和当前数据库 ...

  6. mysql常见死锁_MySQL死锁系列-常见加锁场景分析

    如下图所示,数据库的隔离等级,SQL 语句和当前数据库数据会共同影响该条 SQL 执行时数据库生成的锁模式,锁类型和锁数量. 下面,我们会首先讲解一下隔离等级.不同 SQL 语句 和 当前数据库数据对 ...

  7. 高并发编程-Daemon Thread的创建以及使用场景分析

    文章目录 官方文档 Daemon Thread VS User Thread Daemon thread的特点 方法 void setDaemon(boolean status) boolean is ...

  8. Ansible自动化运维企业实际应用场景分析

    企业实际应用场景分析 Dev开发环境 使用者:程序员 ​ 功能:程序员个人的办公电脑或项目的开发测试环境,部署开发软件,测试个人或项目整体的BUG的环境 ​ 管理者:程序员 测试环境 使用者:QA测试 ...

  9. shiro的会话管理:应用场景分析

    应用场景分析 在分布式系统或者微服务架构下,都是通过统一的认证中心进行用户认证.如果使用默认会话管理,用户信息只会保存到一台服务器上.那么其他服务就需要进行会话的同步. 会话管理器可以指定sessio ...

最新文章

  1. 《大道至简》读后感(伪代码)
  2. ibm笔记本电脑电池_福建省厦门市集美区电池定制供应多少钱
  3. 微型计算机原理答案第四章,微机原理第四章习题答案.doc
  4. VB用API实现各种对话框(总结)(转载)
  5. php操作redis_PHP操作Redis的基本方法
  6. MapReduce二次排序
  7. token 微信access 过期_如何设计 QQ、微信等第三方账号登陆 ?以及设计数据库表!...
  8. 设计模式学习五、代理模式
  9. Inno Setup打包基本笔记
  10. 鼠标键盘录制工具 脚本录制器 游戏脚本录制工具
  11. 【网启树莓派】无SD卡 从网络驱动树莓派| raspberry boot via pxe
  12. 转载:技术大停滞——范式春梦中的地球工业文明2:科技利益集团鼓吹的范式春梦—所谓的技术大爆炸
  13. 调查:听取当前用户的意见(并改进),是为什么?
  14. vue自定义数字键盘
  15. DFS深度优先搜索详解
  16. 弹出框美化 alert样式美化
  17. 使用ArcPy实现创建ags文件
  18. 【Bioinfo Blog 013】【R Code 011】——甲基化芯片数据分析(ChAMP包)
  19. ACM学习历程—BestCoder 2015百度之星资格赛1002 列变位法解密(vector容器)
  20. tools:callgraph

热门文章

  1. Chrome地理位置信息模拟
  2. 代理重加密(Proxy Re-Encryption)技术原理和Java代码实现
  3. linux命令使用vim报错,LINUX中使用VIM替换报错:pattern not found
  4. PTA猴子选大王(约瑟夫环问题)
  5. vue-router的routes中属性详解
  6. PS基础知识:PS钢笔和路径工具应用知识
  7. keyvaluepair_Dictionary及KeyValuePair使用
  8. Nginx 轻松解决跨域问题
  9. 五分钟学会 SpringAOP 面向切面编程
  10. ReactNative——导航器react-navigation(堆栈式导航器篇)