广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >React 正确使用useCallback useMemo的方式
  • 604
分享到

React 正确使用useCallback useMemo的方式

摘要

目录正确使用useCallback useMemo的姿势useCallbackuseMemo总结正确使用useCallback useMemo的姿势 说起useCallback us

正确使用useCallback useMemo的姿势

说起useCallback useMemo大家肯定在React都不陌生,但是真正了解它们的作用,还是有一部分同学对此是一知半解,只是知道用它,却不知道它真正的含义。
今天带大家学习一下它们的真正蕴藏的作用。
useCallback useMemo 都是记忆函数,什么是记忆函数呢?
用个最简单的例子来讲 useState 也是记忆函数 细想一下以下代码,为什么setcount每次改变会引起组件重新render,但是count为什么不会再次被初始值0进行赋值呢?
如果是这样的话,我们就不能修改成功了,所以说存在某个地方保存了state的值,而这个地方是不会受到render的影响的,state就被缓存起来了。

const [count, setcount] = useState(0);

那么 useCallback useMemo 也是被缓存起来了吗?让我们逐个来看看

useCallback

useCallback 的作用是啥?我们来看看下面的代码:

import React, { memo, useCallback, useState } from "react";

const HookTest = memo(() => {
  const [count, setcount] = useState(0);
  const [num, setnum] = useState(100);
  const showCount = () => {
 	console.log("没事执行玩玩", count + "$");
  };
  return (
    <div>
      <h2>HookTest:useCallback----useMemo</h2>
      <h3>useCallBack</h3>
      <h4>
        count:{count}---num:{num}
      </h4>
      <button onClick={showCount}>showCount</button>
      <button onClick={(e) => setcount(count + 3)}>+3</button>
      <button onClick={(e) => setnum(num * 10)}>*10</button>
  );
});

export default HookTest;

正常执行的话,修改count 和 num 都会触发 render ,这是毫无疑问的。那么showCount 每次render也会被重新创建一次,这也是情理之中的。 但是我们想想,真的有必要每次render都重新创建showCount 吗?现在可能只有一个函数,函数体也简单,重新创建也影响不了什么,但是真正开发的时候却是我们要考虑的问题。 所以 useCallback 来帮我们解决这个问题了!

 const showCount = () => {
 	console.log("没事执行玩玩", count + "$");
  };
  
  const showCount = useCallback(() => {
    console.log("没事执行玩玩", count + "$");
  }, [count]);

useCallback 接收两个参数 第一个为需要缓存的函数 第二个为数组,装载依赖

那么现在的 showCount 和之前的又有什么不一样呢?
现在的 showCount 是被缓存起来了,组件render时,如果装载依赖的数组中的依赖未更新,那么依然采用缓存的函数。也就是说只有当我点修改count时触发更新组件render后,showCount 也重新创建,但是当我进行其他的操作引起组件render时,由于此时条件依赖跟装载依赖的数组中依赖毫无关系,showCount 用的是缓存里的函数。这就是 useCallback 的正确使用方法啦~

useMemo

看下面案例:

import React, { memo, useMemo, useState } from "react";

const HookTest = memo(() => {
const [count, setcount] = useState(0);
  const [arr, setarr] = useState([
    {
      flag: true,
      num: 20,
    },
    {
      flag: false,
      num: 10,
    },
    {
      flag: true,
      num: 40,
    },
    {
      flag: true,
      num: 60,
    },
    {
      flag: true,
      num: 70,
    },
    {
      flag: true,
      num: 80,
    },
  ]);

   const allNum = () =>
     arr.reduce(
       (preValue, currentValue) =>
         currentValue.flag ? preValue + currentValue.num : preValue,
       0
     );
  return (
    <div>
      <h2>HookTest:useCallback----useMemo</h2>
      <h3>useMemo</h3>
       <h4>
        count:{count}
      </h4>
      <button onClick={(e) => setcount(count + 3)}>+3</button>
      <h4>all:{allNum}</h4>
    </div>
  );
});
export default HookTest;

很简单的小案例,根据条件对数组求和操作,同样我们点击修改count 然后组件重新render
此时我们考虑一个问题,是不是 allNum 又进行了一次复杂的运行然后得到结果?现在看来才几条数据,怎么复杂了,我们得考虑数组若是几百上千上万呢?我们都知道组件渲染是很频繁的,那么每次渲染我们真的有必要去每次进行复杂的运算吗?

所以这就是性能优化的另一个点了 引出 useMemo来帮助我们解决

将allNum 改造后:

const allNum = () =>
     arr.reduce(
       (preValue, currentValue) =>
         currentValue.flag ? preValue + currentValue.num : preValue,
       0
     );
  
  const allNum = useMemo(
    () =>
      arr.reduce(
        (preValue, currentValue) =>
          currentValue.flag ? preValue + currentValue.num : preValue,
        0
      ),
    [arr]
  );

useMemo 同样接收两个参数 第一个参数是函数的返回值!! 第二个为数组,装载依赖
用了之后呢?有那些改变呢?
现在 allNum 不再是一个函数了,而是一个返回值现在如果进行和依赖数组无关的render时,allNum 将采用上次缓存的返回值,不用再去傻傻的计算一遍啦。

总结

简单给大家总结下:

  • useCallback 缓存函数
  • useMemo 缓存函数返回值
  • 都是解决组件频繁渲染从而频繁创建函数及频繁运行函数
  • 正确的思路应该是 跟我有关的时候我才需要去重新创建函

到此这篇关于React 正确使用useCallback useMemo的方式的文章就介绍到这了,更多相关React useCallback useMemo内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: React 正确使用useCallback useMemo的方式

本文链接: https://www.lsjlt.com/news/172099.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React 正确使用useCallback useMemo的方式
    目录正确使用useCallback useMemo的姿势useCallbackuseMemo总结正确使用useCallback useMemo的姿势 说起useCallback us...
    99+
    2022-11-13
    React 使用useCallback useMemo方式 React  useCallback useMemo
  • useCallback和useMemo的正确用法详解
    目录正文缓存值缓存函数组件为什么会重新渲染缓存复杂的计算什么是复杂的计算何时进行优化呢总结正文 现实很多项目存在大量的useMemo和useCallback,大多数的使用并没有起到实...
    99+
    2023-01-15
    useCallback和useMemo用法 useCallback useMemo
  • React useMemo和useCallback的使用情景
    这篇文章主要讲解了“React useMemo和useCallback的使用情景”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React useMemo和useCallback的使用情景”吧...
    99+
    2023-06-14
  • React useMemo和useCallback的使用场景
    目录useMemouseCallback useMemo 我们知道当父组件发生重新渲染时,其所有(状态、局部变量等)都是新的。一旦子组件依赖于父组件的某一个对象变量,那么无论对象是否...
    99+
    2022-11-12
  • React中memo、useCallback和useMemo的使用场景是什么
    这篇“React中memo、useCallback和useMemo的使用场景是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2023-07-05
  • setTimeout在vue中的正确使用方式
    目录setTimeout在vue中的正确使用遇到了1个坑问题出在我的格式上面解决vue在setTimeout内修改this失效使用箭头函数总结setTimeout在vue中的正确使用...
    99+
    2023-01-28
    vue使用setTimeout vue setTimeout setTimeout在vue使用
  • 详解Flutter中key的正确使用方式
    目录1、什么是key2、key的更新原理3、key的分类GlobalKeyLocalKey总结1、什么是key Widget中有个可选属性key,顾名思义,它是组件的标识符,当设置...
    99+
    2023-01-28
    Flutter key使用方式 Flutter key
  • C#使用HttpClient的正确方式你了解吗
    目录错误使用New HttpClientstatic HttpClient正确使用错误使用 New HttpClient 如下面一段代码,日常开发中经常使用的 call http 方...
    99+
    2022-11-12
  • 如何正确的使用awk正则表达式
    这篇文章给大家介绍如何正确的使用awk正则表达式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、模糊匹配:awk ‘{if($3~/97/) print $0}' da...
    99+
    2023-06-09
  • 正确使用dotnet-*工具的方法
    目录安装验证dotnet-dumpcreatedump分析coredump文件相关资料:安装 因为我们现在都是容器化时代了,所以我们可以把这类工具全部制作成基础镜像 ...
    99+
    2022-11-12
  • Linux中Homebrew的正确使用方法
    很多人都在使用linux Homebrew ,有三个技巧可以帮助你更好的使用它: 避免环境污染 首先要避免将 Homebrew 的 bin 目录添加到 $PATH ,而仅仅将你需要使用的几个可执行做软连接放到&...
    99+
    2022-06-04
    linux homebrew用法
  • 正确使用dotnet工具的方法
    正确使用dotnet工具的方法有以下几步:1. 安装dotnet SDK:首先需要在计算机上安装dotnet SDK,可以从dotn...
    99+
    2023-08-16
    dotnet
  • 如何正确的使用pykeyboard方法
    如何正确的使用pykeyboard方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。· 键盘操作k.type_string(‘abcdefg') --输入内容k.p...
    99+
    2023-06-08
  • 如何正确的使用OGNL表达式
    如何正确的使用OGNL表达式?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一.OGNL中的#、%和$符号    &nbs...
    99+
    2023-05-31
    ognl表达式 og
  • vue正确使用watch监听属性变化方式
    目录基本用法监听object使用deep参数重新赋值通过路径监听内部数据初始化变量触发监听回调总结Vue中可以使用监听器监听属性的变化,并根据属性变化作出响应。但一旦涉及到复杂数据的...
    99+
    2022-11-13
  • 详解PHP调用Go服务的正确方式
    目录问题服务耦合服务抽取Unix Domain Sockets进程间通信简单介绍适用场景代码实现Go 实现的 Trie 树Go ServerPHP Client小结效率杂谈问题 服务...
    99+
    2022-11-12
  • React html中使用react的两种方式
    基本使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8...
    99+
    2022-11-12
  • 如何正确的使用mysql-joins方法
    今天就跟大家聊聊有关如何正确的使用mysql-joins方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。假设有两个表,Table_A和Table_B。这两个表中的数据如下所示:TA...
    99+
    2023-06-06
  • MySQL分区表的正确使用方法
    MySQL分区表概述 我们经常遇到一张表里面保存了上亿甚至过十亿的记录,这些表里面保存了大量的历史记录。 对于这些历史数据的清理是一个非常头疼事情,由于所有的数据都一个普通的表里。所以只能是启用一个或多个...
    99+
    2022-10-18
  • Python线程池的正确使用方法
    目录Python线程池的正确使用1、为什么要使用线程池呢?2、线程池怎么用呢?3、如何非阻塞的获取线程执行的结果4、线程池的运行策略Python线程池的正确使用 1、为什么要使用线程...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作