返回顶部
首页 > 资讯 > 前端开发 > JavaScript >React中useCallbackuseMemo使用方法快速精通
  • 883
分享到

React中useCallbackuseMemo使用方法快速精通

ReactuseCallbackReactuseMemo 2023-02-14 18:02:00 883人浏览 安东尼
摘要

目录useCallback和useMemo的区别useMemouseCallback首先从简单的讲一下两者的区别 useCallback和useMemo的区别 基本使用 // 贴上

首先从简单的讲一下两者的区别

useCallback和useMemo的区别

基本使用

	// 贴上代码片利于复制
	import { React, useState, useMemo, useCallback } from "react";
	export default function TestPage() {
	  const callBack = useCallback(() => {
	    console.log(1);
	  }, []);
	  const memo = useMemo(() => 123, []);
	  console.log("callback", callBack);
	  console.log("memo是", memo);
	  return (
	    <div>
	      <div>一个专门用于Vue测试的页面</div>
	    </div>
	  );
}

控制台输出如下

可以直观的看到,useCallBack返回的是一个函数,useMemo返回的是一个变量。

接下来我们来剖析这两个东西的用法

useMemo

首先从简单的讲起,如果你学过Vue的话,完全可以把它当成Computed来理解。在这里举一个很好理解的

	import { React, useState, useMemo, useCallback } from "react";
	export default function TestPage() {
	  const [data, updateData] = useState(1);
	  const getComplicatedValue = () => {
	    console.log("开始计算一个复杂的value值啦!");
	    let total = 0;
	    for (let i = 0; i < 100; i++) {
	      total += i;
	    }
	    return total;
	  };
	  const changeData = () => {
	    updateData((oldValue) => oldValue + 1);
	  };
	  return (
	    <div>
	      <div>一个专门用于vue测试的页面</div>
	      <div>这是一个复杂函数计算出来的值{getComplicatedValue()}</div>
	      <div>这是一个简简单单的data值{data}</div>
	      <button onClick={changeData}>点击我改变data值</button>
	    </div>
	  );
	}

大意就是,页面上有一个很简单的值data,还有一个很复杂的经过函数计算出来的值getComplicatedValue,这里我用从1加到100来模拟了一个很复杂的计算过程(实际项目会更复杂)。

页面显示如下

显示正常,根据控制台显示也可以看到getComplicatedValue函数也被正常调用了。接下来我们点击按钮改变data的值。

可以看到页面是正常更新了的,但是性能问题出现了,我改变了data的值,导致render函数重新执行,然后getComplicatedValue又被执行了一遍!也就是计算机重新计算了1加到100。那么问题出现了,如果我是1加到100000呢?很显然,在我们更新data值的时候,并不需要getComplicatedValue再次执行,而是希望它的计算值被缓存起来。useMemo闪亮登场!!!当当当当。

改写如下,改写只需要改动两行

	import { React, useState, useMemo, useCallback } from "react";
	export default function TestPage() {
	  const [data, updateData] = useState(1);
	  const getComplicatedValue = useMemo(() => {
	    console.log("开始计算一个复杂的value值啦!");
	    let total = 0;
	    for (let i = 0; i < 100; i++) {
	      total += i;
	    }
	    return total;
	  },[]);
	  const changeData = () => {
	    updateData((oldValue) => oldValue + 1);
	  };
	  return (
	    <div>
	      <div>一个专门用于vue测试的页面</div>
	      <div>这是一个复杂函数计算出来的值{getComplicatedValue}</div>
	      <div>这是一个简简单单的data值{data}</div>
	      <button onClick={changeData}>点击我改变data值</button>
	    </div>
	  );
	}

第四行把getComplicatedValue函数用useMemo包裹起来。第18行删除(),因为刚刚已经说过,useMemo返回的是一个值而不是函数。

接下来再看看页面效果

这次可以看到,无论data值更新多少次,getComplicatedValue永远只执行了初始化的那一次。

来个首尾呼应

基本使用

const memo = useMemo(() => {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->},[依赖项数组])

如果依赖项数组里面的数据没有变化,那么memo值永远使用缓存,而不会重新计算

useCallback

useCallback比起useMemo就难上了一丢丢,因为涉及到了子组件。当然也是灰常简单。

首先来看一个简单

父组件

	import { React, useState, useMemo, useCallback } from "react";
	import TestSonComp from "./testSonComp";
	export default function TestPage() {
	  const [data, updateData] = useState(1);
	  const getValue = () => {
	    console.log("我是父组件的一个函数");
	  };
	  const changeData = () => {
	    updateData((oldValue) => oldValue + 1);
	  };
	  return (
	    <div>
	      <div>一个专门用于vue测试的页面</div>
	      <div>这是一个简简单单的data值{data}</div>
	      <button onClick={changeData}>点击我改变data值</button>
	      <TestSonComp getValue={getValue} />
	    </div>
	  );
}

子组件

	import { React, memo } from "react";
	const TestSonComp = (props) => {
	  console.log("子组件render函数执行了");
	  return <div>一个子组件</div>;
	};
	export default TestSonComp;

页面显示正常,然后点击按钮更新数据

那么此时问题又出现了,我就是在父组件中改了一下data值,data值导致父组件render重新执行,render生成了一个新的getValue函数,然后子组件props更新,导致子组件更新。那么有没有一个方法可以把函数缓存起来呢?

useCallback闪亮登场。

直接改写父组件定义函数的一行

	  const getValue = useCallback(() => {
	    console.log("我是父组件的一个函数");
	  }, []);

改完之后看页面效果你依然会发现和上图一样,子组件依然会更新!

问题出在这

useCallback必须配合React.memo来使用

react的Hooks组件对props的浅比较是在memo里面比较的(类组件是在shouldComponentUpdate里面),如果没有memo,那么你使用useCallback就没有意义

怎么使用?

子组件直接改写最后一行

export default memo(TestSonComp);

二话不说看效果

改写成功

再来个温故知新

基本使用

const callback = useCallback(() => {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->},[依赖项数组])

如果依赖项数组里面的数据没有变化,那么函数值也永远使用缓存。

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

--结束END--

本文标题: React中useCallbackuseMemo使用方法快速精通

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

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

猜你喜欢
  • React中useCallbackuseMemo使用方法快速精通
    目录useCallback和useMemo的区别useMemouseCallback首先从简单的讲一下两者的区别 useCallback和useMemo的区别 基本使用 // 贴上...
    99+
    2023-02-14
    React useCallback React useMemo
  • 快速掌握VueRouter使用方法
    目录一、编程式路由导航二、缓存路由组件三、两个新的声明周期钩子四、路由守卫五、路由器的两种工作模式本篇博客会介绍Vue中的VueRouter的基本使用,编程式路由导航增加了我们进行路...
    99+
    2023-01-09
    Vue Router用法 Vue Router原理
  • Vue和React中快速使用Electron的简单教程
    目录提示:前言一、前提二、在Vue和React中快速使用1. 安装Electron2. 运行成功后,打包成软件总结提示: 本篇文章只是教你简单上手,Electron本身功能是非常强大...
    99+
    2024-04-02
  • 如何使用create-react-app快速构建React开发环境
    这篇文章给大家分享的是有关如何使用create-react-app快速构建React开发环境的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。常用的脚手架react-boilerpl...
    99+
    2024-04-02
  • 快速掌握Node.js中setTimeout和setInterval的使用方法
    Node.js和js一样也有计时器,超时计时器、间隔计时器、及时计时器,它们以及process.nextTick(callback)函数来实现事件调度。今天先学下setTimeout和setInterval...
    99+
    2022-06-04
    使用方法 快速 Node
  • React中使用Mobx的方法
    目录一、Mobx前端状态管理框架 基础概念?1. 什么是Mobx2. 什么是状态管理?3. 为什么需要状态管理?状态管理的一般思想(Flux)二、mobx的用法1. 安装 mobx2...
    99+
    2023-02-03
    React使用Mobx React使用Mobx
  • Java快速排序方法怎么使用
    本篇内容介绍了“Java快速排序方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!快速排序思想介绍快速排序使用了分治的思想,通过一轮...
    99+
    2023-06-02
  • react使用websocket实时通信方式
    目录使用websocket实时通信创建公共组件在react组件中的使用websocket在不同情形下的使用1.在react中使用websocket2.websocket在小程序中使用...
    99+
    2024-04-02
  • Win7快速清理使用痕迹方法技巧
      随着win7系统的快速普及,时下很多时候用户都是在使用win7进行办公、学习、娱乐以及处理各种事物,而在操作过程中难免会留下使用痕迹,这些痕迹有些是我们希望留下的,有些是我们不希望留下的,不过这种痕迹留存也是win7...
    99+
    2023-05-31
    Win7 清理 使用痕迹 痕迹 技巧 方法
  • 在react中如何使用mockjs方法
    本篇内容主要讲解“在react中如何使用mockjs方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在react中如何使用mockjs方法”吧!介绍mock意为“模仿”或"模拟&qu...
    99+
    2023-06-29
  • React中10种Hook的使用方法
    本篇文章给大家分享的是有关React中10种Hook的使用方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。React Hook是什么?React官网是这么介绍的: Hook ...
    99+
    2023-06-25
  • React中使用antd组件的方法
    目录antd使用antdantd antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。 国内镜像为:https://ant-d...
    99+
    2024-04-02
  • React插槽使用方法
    目录需求 核心思想 React实现插槽的两种方式需求 我们自己写了个组件,引用组件时想要在组件中写入内容,并且写入的内容可以被组件识别、控制,用过Vue的同学肯定会立刻想到slot...
    99+
    2024-04-02
  • Shiro在springboot中快速实现方法
    目录一、shiro使用必须了解的知识1、shiro是什么?2、shiro架构三个常用三大核心对象3、在springboot中使用时,主要可将其看作两个模块(请求过滤模块、认证授权模块...
    99+
    2023-02-07
    springboot实现Shiro springboot快速实现Shiro
  • Element-Plusel-col、el-row快速布局及使用方法
    目录前言一、el-colspanpush & pull响应式offset二、el-rowgutterjustifyalign总结前言 拖拉了一晚, 总结了一些Layout布局...
    99+
    2022-12-19
    Element-Plus el-col el-row布局 Element-Plus 布局 el-col el-row布局
  • React中的axios模块及使用方法
    目录1 axios介绍2 使用方法2.1 在React中安装axios2.2 get请求2.3 post请求:发送表单数据和文件上传2.4 put请求:对数据进行全部更新2.5 pa...
    99+
    2024-04-02
  • React中memouseCallbackuseMemo方法作用及使用场景
    目录memo()、useCallback()、useMemo()使用场景React.memo()React.useCallback()React.useMemo()memo()、us...
    99+
    2023-03-06
    React useCallback useMemo React useMemo
  • react navigation方法如何使用
    本篇内容介绍了“react navigation方法如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!react navigation会...
    99+
    2023-07-04
  • react children方法如何使用
    这篇文章主要介绍“react children方法如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react children方法如何使用”文章能帮助大家解决问题。react children...
    99+
    2023-07-04
  • React浅析Fragments使用方法
    目录概述动机短语法带key 的Fragments概述 可以将子列表分组,而无需向DOM添加额外节点简单理解:空标签<React.Fragment></React.F...
    99+
    2022-12-03
    React Fragments的使用 React Fragments
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作