【React】useCallback 使用的说明

2023-12-12 08:04

本文主要是介绍【React】useCallback 使用的说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • useCallback的优缺点
      • 优点
      • 缺点
      • JavaScript 的内联优化
    • 使用场景

用了两年多的react,今天抽空写点小内容

useCallback的优缺点

缓存了每次渲染时候 inline callback的实例

优点

关键点:利用memoize减少无效的re-render,通常配合shouldComponentUpdate 或者 React.memo 起到减少不必要渲染的目的

  1. 性能优化:useCallback可以帮助避免每次渲染的时候创建新的函数实例。这对于将函数作为props传递给子组件的时候特别有用,因为子组件可以使用React.memo 来进行浅比较,从而避免不必要的重新渲染
  2. 依赖性控制: useCallback 接受一个依赖数组作为第二个参数,使得你可以明确指定哪些变量的变化应该导致函数重新创建。这有助于精确控制依赖,避免不必要的重新计算。

缺点

  1. 过度使用可能导致性能问题:useCallback可能会阻止某些优化(如内联)
  2. 增加复杂性:在简单组件中,使用useCallback 可能会显得过于繁琐,因此优先考虑组件的复杂性和性能需求,权衡是否使用useCallback
  3. 可能引入bug:如果依赖数组设置不当,导致函数被错误缓存

JavaScript 的内联优化

  1. 内联优化:内联指的是 将函数调用代码直接插入到调用处,而不是通过函数调用方式执行,这样可以减少函数调用的开销,提高性能。当使用useCallback 包裹一个函数时候,React 可能无法在一些情况进行内联,因为useCallback返回的是同一个函数实例,而不是新的函数
const memoizedCallback = useCallback(() => {// function body
}, [/* dependencies */]);// 内联优化可能受到影响
<SomeComponent onClick={memoizedCallback} />
  1. 对象缓存:内联也与对象的创建和缓存有关。如果一个函数内部创建了对象,并且该函数被useCallback缓存,那么对象可能被缓存在在闭包中,导致无法及时被垃圾回收。这可能会在长时间运行的应用中引起内存泄露问题
const memoizedCallback = useCallback(() => {const obj = { key: 'value' };// 使用 obj
}, [/* dependencies */]);// obj 可能无法及时被垃圾回收

为了确保在不再需要时能够及时释放对象并触发垃圾回收,你可以采取以下步骤:

import { useCallback, useEffect, useRef } from 'react';const MyComponent = () => {const memoizedObject = useRef(null);memoizedObject.current = useCallback(() => {const obj = { key: 'value' };// 使用 objreturn obj;}, [/* dependencies */]);// ...// 如果 memoizedObject 不再被使用,设置为 null 或者清除引用useEffect(() => {return () => {// 清除对 memoizedObject 的引用// 这样,在组件卸载或 memoizedObject 不再使用时,可以及时触发垃圾回收memoizedObject.current = null;};}, []);// ...
};

在这个例子中,我们使用 useEffect 来监听组件的生命周期,并在组件即将卸载时执行清理操作。通过将 memoizedObject.current 设置为 null 或清除引用,我们告诉垃圾回收器这个对象不再被需要。这有助于确保在组件卸载或不再需要时能够及时释放对象并触发垃圾回收。

请注意,这里使用了 memoizedObject.current,因为在 React Hooks 中,我们经常使用 useRef 来保存可变的值,并确保在组件重新渲染时保持其稳定性。如果你使用 useRef 来保存 memoizedObject,你可以在 useEffect 中设置 memoizedObject.current 为 null 或清除引用。

使用场景

  1. 函数被 useEffect 内部所引用了,但为了避免频繁的useEffect的频繁调用,可以选择包一下;
  2. 需要保存一个函数闭包结果,如配合 debounce、throttle使用;
  3. useCallback包裹的函数,但某个依赖项变化时,引用这个函数的所有 useEffect 都得重新执行一下;

最后分享一个外链:Day383:说下 React 的 useEffect、useCallback、useMemo

这篇关于【React】useCallback 使用的说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/483860

相关文章

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的