react hooks useCallback useMemo的区别

2023-11-09

最近在看react hooks,useState和useEffect较好理解,到useCallback和useMemo的时候,看官网不太懂,后来通过查阅资料,算是搞明白了,下面实例都是基于react-native,不过原理和react是一样的

1、useCallback

      useCallback返回一个函数,此函数具有memoized功效

     (1)使用场景:有一个父组件,含子组件,子组件接收一个函数作为props,通常,如果父组件更新了,子组件也会更新,但如果父组件更新的state,与子组件没关系,这时候,

子组件再更新是没有必要的。这时,可以借助useCallback返回函数,然后把这个函数作为props传给子组件,这样子组件可以避免不必要的更新。

     (2)疑问:大家可能会有疑问,可以在子组件里面使用PureComponent或Memo,这样如果子组件props不发生变化,子组件就不更新,如下:

    父组件:    

import React, {useState,useCallback} from "react";
import {View,Text,Button,StyleSheet} from 'react-native';
import Child1 from './Child1';
import Child2 from './Child2';

export default function CallBackHookDemo(){
    console.log('CallBackHookDemo 重新渲染------');
    const [count,setCount] = useState(0);
    const [show,setShow] = useState(true);
    const increment1 = ()=>{
        console.log('执行increment1函数');
        setCount(count+1);
    }
    return(
        <View style={styles.container}>
            <Text>CallBackHookDemo:{count}</Text>
            <Child1 increment={increment1}/>
            <Child2 gender={'0'} count={count}/>
            <Button title={'show切换'} onPress={(e) =>setShow(!show)}/>
        </View>
    )
}
const styles = StyleSheet.create({
    container:{
        paddingTop:40
    }
})

子组件:

import React,{memo} from 'react';
import {Button} from 'react-native';

const Child1 = memo(function Child1(props){
    console.log('Child1 重新渲染');
    return (
        <Button title={'button+1'} onPress={props.increment}/>
    )
})
export default Child1;

如上面代码:比如点击show切换按钮,这时候修改了show,原则上父组件重新render时,Child1组件是没有必要更新的,但是会更新。为什么呢?

原因是:子组件里面用的memo是浅比较,而子组件Child1的props是一个函数increment1,每次父组件rerender时,都会重新生成一个函数,所以浅比较毫无意义。

这时候就要用useCallback,将父组件修改如下:

import React, {useState,useCallback} from "react";
import {View,Text,Button,StyleSheet} from 'react-native';
import Child1 from './Child1';
import Child2 from './Child2';

export default function CallBackHookDemo(){
    console.log('CallBackHookDemo 重新渲染------');
    const [count,setCount] = useState(0);
    const [show,setShow] = useState(true);
    const increment2 = useCallback(()=>{
        console.log('执行increment2函数');
        setCount(count+1);
    },[count])
    return(
        <View style={styles.container}>
            <Text>CallBackHookDemo:{count}</Text>
            <Child1 increment={increment2}/>
            <Child2 gender={'0'} count={count}/>
            <Button title={'show切换'} onPress={(e) =>setShow(!show)}/>
        </View>
    )
}
const styles = StyleSheet.create({
    container:{
        paddingTop:40
    }
})

这时,切换show按钮,子组件Child1不会rerender,因为当count不改变时,Child1的props increment不会发生改变。这样节省了性能

2、useMemo

     useMemo返回一个值,此值具有memoized功效

   (1)使用场景:

    当组件内部某一渲染的数据,要通过计算得到,这个计算依赖于特定的state或props,我们就用useMemo来缓存这个渲染的数据,以致于我们在修改它们没有依赖的数据源的情况下,

多次调用这个计算函数,浪费性能

子组件Child2:

import React,{useState,useMemo,memo} from 'react';
import {Text} from 'react-native';

const Child2 = memo(function Child2(props){
    console.log('Child2 渲染----');
    const transferGender= (gender)=>{
        console.log(gender)
        return gender=='0' ?'男':'女';
    }
    const gender = useMemo(()=>
        transferGender(props.gender)
    ,[props.gender])
    return (
        <Text>{gender}:{props.count}</Text>
    )
})
export default Child2;

如上代码:父组件的count修改时,子组件Child2会rerender,但Child2的props gender没有发生变化,所以这时用useMemo,防止gender运算方法多次执行,浪费性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react hooks useCallback useMemo的区别 的相关文章

随机推荐

  • AdapterView及子类的相关学习整理

    一 了解 AdapterView 及其子类 这个图片是网上找的 主要是了解一下结构 其中AbsListView AbsSpinner AdapterViewAnimation依然是抽象类 实际使用时需要使用它们的子类 后面我会逐个练习这些子
  • python总结(九):python面向对象高级编程

    一 给实例绑定属性 方法 给类绑定方法 coding utf 8 class Student object pass 给实例绑定属性 s Student s name Jason Zhang s score 90 print s name
  • Mybatis中的一般查询

    1 经常要使用到根据文本框输入的内容来进行模糊查询 这个时候涉及到几个问题 xml文件怎么样写模糊查询语句 即怎么样拼接参数的问题 此外还需要判断某个传递的参数是否为空的问题 控制器中怎么样传递这个参数这样在xml文件中的if标签才可以使用
  • VUE element-ui之el-tree树形控件获取最后一级节点(无子节点的节点)

    步骤 模板中定义ref
  • Qt 富文本处理(11):表格和表格格式

    文章目录 前言 QTextTable类 QTextTableFormat类 QTextTableCell 类 QTextTableCellFormat 类 代码示例 总结 前言 富文本文档的表格相关类 QTextTable类 QTextTa
  • linux下通过.sh文件启动java程序

    http blog csdn net cnmcxiari article details 6673081 linux下通过 sh文件启动java程序 首先把java程序打成jar包 指定好主类 入口 sh文件如下 bin sh java X
  • 区块链会给医药行业带来哪些改变?

    我不是药神 上映以来好评如潮 票房大涨 是一部叫好又叫座的佳作 不仅豆瓣评分9 0 更被人民日报誉为近年来难得一见的经典电影 该片真实再现了白血病群体的生存现状 让观众对白血病患者有了深刻的认知 也将一个残酷的现实摆在面前 一场大病足以让一
  • 编译Hi3516DV300的SDK

    前言 如果您之前编译过EV200的SDK 那么您会发现 编译DV300的过程很类似 软件包直接拷贝 无需重新下载 通常在1 2个小时内能搞定SDK的编译 DV300的入门会简洁介绍 如果遇到编译错误 请你阅读EV200的编译过程和相应目录下
  • ACL 2023 :大模型的安全与可靠性、复杂逻辑查询、情感分析等

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 哔哩哔哩直播通道 扫码关注AI TIME哔哩哔哩官方账号预约直播 13 30 13 50 Yu Zhou NonSequential Graph Script Induction
  • jmap命令详解

    JVM常见命令之jmap jmap命令详解 jmap是一个很重要的命令 可以查看JVM内存使用情况 jmap帮助文档 参数解释 option 选项参数 pid 需要打印配置信息的进程ID executable 产生核心dump的Java可执
  • Linux学习笔记——例说makefile 头文件查找路径

    0 前言 从学习C语言开始就慢慢开始接触makefile 查阅了很多的makefile的资料但总感觉没有真正掌握makefile 如果自己动手写一个makefile总觉得非常吃力 所以特意借助博客总结makefile的相关知识 通过例子说明
  • Python os模块相关简介

    Python里os path isdir 等函数的作用和用法 一 用法和概念 Python里的os模块用于和系统进行交互 其里 os listdir 用于返回一个由文件名和目录名组成的列表 需要注意的是它接收的参数需要是一个绝对的路径 os
  • 使用 Docker 快速上手中文版 LLaMA2 开源大模型

    本篇文章 我们聊聊如何使用 Docker 容器快速上手朋友团队出品的中文版 LLaMA2 开源大模型 国内第一个真正开源 可以运行 下载 私有部署 并且支持商业使用 写在前面 感慨于昨天 Meta LLaMA2 模型开放下载之后 GitHu
  • C++中随机数的生成

    一 伪随机数 在C 中要生成随机数 首先要include一个文件
  • 手机屏幕测试html,华为手机屏幕检测代码是什么

    类型 系统工具大小 1 4M语言 中文 评分 10 0 标签 立即下载 华为手机很多操作代码用户记住后是可以快捷使用的 有小伙伴想要进行屏幕检测 那华为手机屏幕检测代码是什么 西西小编来为大家介绍 华为手机屏幕检测代码是什么 华为手机屏幕检
  • C语言最大子序列和三种常用解决方法

    注 看不懂评论区提问 有问必答 问题 给定K个整数组成的序列 N 1 N 2 N K 连续子列 被定义为 N i N i 1 N j 其中 1 i j K 最大子列和 则被定义为所有连续子列元素的和中最大者 例如给定序列 2 1 3 4 1
  • BGP一网双平面实验

    实验说明 1 A面 顶面 路由器在AS2 B面 底面 路由器在AS3 宁波路由器在AS1 西安路由器在AS4 2 IP设计 协议号设计如图所示 3 宁波办公路由IP 10 100 1 1 业务路由IP10 100 2 2 西安办公路由IP1
  • Windows 注册表(Registry) 学习

    目录 一 注册表 Registry 介绍 1 注册表简介 2 开启 禁用 注册表编辑器 3 注册表位置 二 注册表的结构 三 修改注册表实现 应用程序开机自启动 一 注册表 Registry 介绍 1 注册表简介 注册表是windows系统
  • 【安装文档】TRex流量分析仪保姆级安装指南--基于VMware虚拟机(ubantu18.04@Intel 82545EM

    前言 DPDK 网络数据开发中文网开发中文网致力于整理收录dpdk spdk ovs vpp dpvs virtiohost sdn ovn qemu等方向 的github开源项目 资料文档 书籍 讲解视频 各大企业招聘信息 23 1 12
  • react hooks useCallback useMemo的区别

    最近在看react hooks useState和useEffect较好理解 到useCallback和useMemo的时候 看官网不太懂 后来通过查阅资料 算是搞明白了 下面实例都是基于react native 不过原理和react是一样