iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >React中memo、useCallback和useMemo的使用场景是什么
  • 552
分享到

React中memo、useCallback和useMemo的使用场景是什么

2023-07-05 08:07:26 552人浏览 泡泡鱼
摘要

这篇“React中memo、useCallback和useMemo的使用场景是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这

这篇“React中memo、useCallback和useMemo的使用场景是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“React中memo、useCallback和useMemo的使用场景是什么”文章吧。

memo()、useCallback()、useMemo()使用场景

当父组件的props或state变化时,render重新渲染,但传递给子组件的props没有发生变化说着只是简单调用了一下子组件,这时子组件也要重新渲染,这就导致了组件的不必要的渲染

React.memo()

当父组件只是简单调用子组件,并未给子组件传递任何属性,我们可以通过memo来控制函数组件的渲染

React.memo()将组件作为函数(memo)的参数,函数的返回值(Child)是一个新的组件。

import { useState } from "react";import { Child } from "./child";export const Parent = () => {  const [count, setCount] = useState(0);  const increment = () => setCount(count + 1);  return (    <div>      <button onClick={increment}>点击次数:{count}</button>      <Child />    </div>  );};
import {memo} from 'react'export const Child=memo(()=>{    consloe.log('渲染了')    return <div>子组件</div>})//使用memo()包裹后的组件,在Parent组件重新渲染更新时,Child组件并没有重新渲染更新

当我们传值给子组件时,这时使用memo函数就对控制组件的更新不起作用了

父组件

import { useState } from "react";import { Child } from "./child";export const Parent = () => {  const [count, setCount] = useState(0);  const [name, setName] = useState("小明");  const increment = () => setCount(count + 1);  const onClick = (name: string) => {    setName(name);  };  return (    <div>      <button onClick={increment}>点击次数:{count}</button>      <Child name={name} onClick={onClick} />    </div>  );};

子组件

import { memo } from "react";export const Child = memo(  (props: { name: string; onClick: (value: any) => void }) => {    const { name, onClick } = props;    console.log("渲染了", name, onClick);    return (      <>        <div>子组件</div>        <button onClick={() => onClick("小红")}>改变 name 值</button>      </>    );  });

出现这样结果的原因:

点击父组件按钮时,改变了父组件的count,导致父组件重新渲染

父组件重新渲染时,重新创建了onClick函数,导致传递给子组件的onClick属性发生了变化,导致子组件重新渲染

如果传递给子组件的只有基本数据类型将不会重新渲染

注意: 如果直接使用useState解构的setName传给子组件, 子组件将不会重复渲染,因为解构出来的是一个memoized 函数。

React.useCallback()

所以,在这种情况下我们使用React.useCallback() useCallback(fn, deps)

import { useCallback, useState } from "react";import { Child } from "./child";export const Parent = () => {  const [count, setCount] = useState(0);  const [name, setName] = useState("小明");  const increment = () => setCount(count + 1);//使用useCallback钩子包裹的回调函数是memoized函数,他初次调用该函数时,缓存参数和计算结果,再次调用这个函数时,如果第二个参数依赖项没有发生改变,则直接返回缓存结果,不会重新渲染  const onClick = useCallback((name: string) => {    setName(name);  }, []);  return (    <div>      <button onClick={increment}>点击次数:{count}</button>      <Child name={name} onClick={onClick} />    </div>  );};

但当我们传递的属性name不字符串,而是对象时

父组件

import { useCallback, useState } from "react";import { Child } from "./child";export const Parent = () => {  const [count, setCount] = useState(0);  // const [userInfo, setUserInfo] = useState({ name: "小明", age: 18 });  const increment = () => setCount(count + 1);  const userInfo = { name: "小明", age: 18 };  return (    <div>      <button onClick={increment}>点击次数:{count}</button>      <Child userInfo={userInfo} />    </div>  );};

子组件

import { memo } from "react";export const Child = memo(  (props: { userInfo: { name: string; age: number } }) => {    const { userInfo } = props;    console.log("渲染了", userInfo);    return (      <>        <div>名字: {userInfo.name}</div>        <div>年龄:{userInfo.age}</div>      </>    );  });

点击父组件count,看到子组件每次都重新渲染了。 分析原因跟调用函数是一样的:

  • 点击父组件按钮,触发父组件重新渲染;

  • 父组件渲染,const userInfo = { name: "小明", age: 18 }; 一行会重新生成一个新对象,导致传递给子组件的 userInfo 属性值变化,进而导致子组件重新渲染。

  • 注意: 如果使用useState解构的userInfo, 子组件将不会重复渲染,因为解构出来的是一个memoized 值。

这时我们使用 React.useMemo() useMemo(() => fn, dep)

React.useMemo()

useMemo()返回的是一个 memoized 值。

如果没有提供依赖项数组,useMemo 在每次渲染时都会计算新的值。

import { useMemo, useState } from "react";import { Child } from "./child";export const Parent = () => {  const [count, setCount] = useState(0);  // const [userInfo, setUserInfo] = useState({ name: "小明", age: 18 });  const increment = () => setCount(count + 1);  const userInfo = useMemo(() => ({ name: "小明", age: 18 }), []);  return (    <div>      <button onClick={increment}>点击次数:{count}</button>      <Child userInfo={userInfo} />    </div>  );};

对比useCallback() 和useMemo()

useCallback(fn, deps) 返回该回调函数的memoized回调函数

const onClick = useCallback((name: string) => {   setName(name); }, []);

useMemo(() => fn, dep) 返回的是一个 memoized 值。

const userInfo = useMemo(() => ({ name: "小明", age: 18 }), []);

以上就是关于“React中memo、useCallback和useMemo的使用场景是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: React中memo、useCallback和useMemo的使用场景是什么

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

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

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

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

下载Word文档
猜你喜欢
  • React中memo、useCallback和useMemo的使用场景是什么
    这篇“React中memo、useCallback和useMemo的使用场景是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2023-07-05
  • React useMemo和useCallback的使用场景
    目录useMemouseCallback useMemo 我们知道当父组件发生重新渲染时,其所有(状态、局部变量等)都是新的。一旦子组件依赖于父组件的某一个对象变量,那么无论对象是否...
    99+
    2022-11-12
  • React useMemo和useCallback的使用情景
    这篇文章主要讲解了“React useMemo和useCallback的使用情景”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React useMemo和useCallback的使用情景”吧...
    99+
    2023-06-14
  • Confd和Consul使用场景是什么
    这篇文章主要介绍了Confd和Consul使用场景是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Confd和Consul使用场景是什么文章都会有所收获,下面我们一起来看看吧。Confd和Consul是什么...
    99+
    2023-07-05
  • Mysql中锁的使用场景是什么
    这篇文章主要讲解了“Mysql中锁的使用场景是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql中锁的使用场景是什么”吧!一、常见锁类型表级锁,锁...
    99+
    2022-10-19
  • Redis的使用场景是什么
    这篇文章主要介绍“Redis的使用场景是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis的使用场景是什么”文章能帮助大家解决问题。Redis常用命令总结:包括时间复杂度总结与具体数据类型...
    99+
    2023-06-02
  • ThreadLocal的原理和使用场景是什么
    ThreadLocal是Java中的一个类,用于在多线程环境中实现线程内部的数据共享。它提供了一个线程局部变量,每个线程都可以独立地...
    99+
    2023-09-12
    ThreadLocal
  • java中@Configuration使用场景是什么
    这篇文章主要讲解了“java中@Configuration使用场景是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java中@Configuration使用场景是什么”吧!一、简单介绍@...
    99+
    2023-07-05
  • java SPI的使用场景是什么
    本文小编为大家详细介绍“java SPI的使用场景是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“java SPI的使用场景是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概念SPI是服务提供界面,JD...
    99+
    2023-06-30
  • vue使用slot的场景是什么
    这篇文章主要介绍“vue使用slot的场景是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue使用slot的场景是什么”文章能帮助大家解决问题。使用场景:通过slot(插槽)可以让用户可以拓展...
    99+
    2023-07-05
  • svg和canvas的适用场景是什么
    今天小编给大家分享一下svg和canvas的适用场景是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2022-10-19
  • Go中sync包Cond使用场景是什么
    本篇内容介绍了“Go中sync包Cond使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景编写代码过程中, 通常有主协程和多个...
    99+
    2023-07-05
  • thinkphp中in删除方法的使用和应用场景是什么
    这篇“thinkphp中in删除方法的使用和应用场景是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“thinkphp中i...
    99+
    2023-07-05
  • Spring @Bean注解的使用场景是什么
    本篇内容介绍了“Spring @Bean注解的使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简单介绍翻看Spri...
    99+
    2023-07-05
  • Golang中多态的优势和应用场景是什么?
    Golang中多态的优势和应用场景是什么?Golang是一门静态类型的编程语言,其具备强大的多态特性,通过接口的使用可以实现多态。多态是面向对象编程的重要特性之一,它允许不同类型的对象通过相同的接口进行操作,提高了代码的复用性和扩展性。在G...
    99+
    2023-12-29
    Golang 多态(Polymorphism) 优势(Advantages)
  • Vue3中reactive与ref函数使用场景是什么
    本文小编为大家详细介绍“Vue3中reactive与ref函数使用场景是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue3中reactive与ref函数使用场景是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
    99+
    2023-07-02
  • Java的引用类型及使用场景是什么
    这篇文章将为大家详细讲解有关Java的引用类型及使用场景是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。每种编程语言都有自己操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java ...
    99+
    2023-06-14
  • Redis在项目中的应用场景是什么
    这篇文章将为大家详细讲解有关Redis在项目中的应用场景是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。相信对于绝大多数程序员来说,redis中间件应该是大家非常熟悉...
    99+
    2022-10-18
  • java消息队列mq的使用场景是什么
    Java消息队列(MQ)的使用场景主要包括以下几个方面:1. 异步通信:当系统中的不同模块之间需要进行异步通信时,可以使用消息队列来...
    99+
    2023-10-09
    java
  • Spring接口在ASP中的应用场景和限制是什么?
    Spring框架是目前最流行的Java企业级开发框架之一,它提供了一套完整的解决方案,包括IoC容器、AOP、事务管理等,可以帮助开发人员快速构建高质量、可维护的企业级应用程序。但是,当我们需要在ASP中使用Spring接口时,需要注意哪些...
    99+
    2023-09-02
    同步 spring 接口
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作