返回顶部
首页 > 资讯 > 精选 >react中的useMemo怎么使用
  • 850
分享到

react中的useMemo怎么使用

2023-07-04 21:07:37 850人浏览 薄情痞子
摘要

今天小编给大家分享一下React中的useMemo怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。概念react 中是

今天小编给大家分享一下React中的useMemo怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

概念

react 中是通过一次次的 re-render (重新渲染)保持我们的值及时的更新到页面上的,每次重新渲染都是一次快照,可以把它想象成一张张的照片,在某个时刻它应该是什么样子的

useMemo

  • 把创建函数和依赖数组项作为参数传入 useMemo,它仅仅会在数组依赖项中的值改变时才会重新计算值

  • 这种优化有助于避免在每次渲染时都进行高开销的计算

  • useMemo 的函数在渲染期间执行,所以不该在此期间做的操作请去除

  • 如果没有提供依赖数据,每次都会重新计算值,相当于没有优化了

栗子

筛选偶数

以下代码实现功能:找出 0count 之间所有的偶数,count 可以动态改变,实时渲染在页面上,count 改变则会引起 re-render

import React, { useState } from 'react';export default () => {  const [count, setCount] = useState(100);  const arr = [];  for (let i = 0; i < count; i++) {    if (i % 2 === 0) {      arr.push(i);    }  }  return (    <>      <fORM>        <label htmlFor="num">Your number:</label>        <input          type="number"          value={count}          onChange={(event) => {            // 设置最大值为 100000            let num = Math.min(100_000, Number(event.target.value));            setCount(num);          }}        />      </form>      <p>        有{arr.length}偶数在 0 到 {count} 之间:<span>{arr.join(', ')}</span>      </p>    </>  );};

每秒获取时间刷新页面

下面代码增加了计时器,在页面显示实时的时间,这样页面每秒钟都会 re-render,也会每秒钟重新筛选一次偶数(尽管 count 并没有变化)

import React, { useState, useEffect } from 'react';export default () => {  const [count, setCount] = useState(100);  const [curTime, setCurTime] = useState('');  const useTime = () => {    useEffect(() => {      const intervalId = window.setInterval(() => {        let time = new Date();        setCurTime(time.toLocaleString());      }, 1000);      return () => {        window.clearInterval(intervalId);      };    }, []);    return curTime;  };  const time = useTime();  const arr = [];  for (let i = 0; i < count; i++) {    if (i % 2 === 0) {      arr.push(i);    }  }  return (    <>      <form>        <div>{time}</div>        <label htmlFor="num">Your number:</label>        <input          type="number"          value={count}          onChange={(event) => {            // 设置最大值为 100000            let num = Math.min(100_000, Number(event.target.value));            setCount(num);          }}        />      </form>      <p>        有{arr.length}偶数在 0 到 {count} 之间:<span>{arr.join(', ')}</span>      </p>    </>  );};

如何优化

那我们需要的是啥,虽然每秒钟都在重新获取时间,但是我们的 count 如果并没有变化的话,我们没必要去一直重新计算它的,特别如果 count 的值特别大的时候,特别如果在一些旧设备上看着就会显得卡顿,极其影响性能 有了 useMemo 就是 so easy 啊

我们来改造下计算偶数地方的代码:这样如果 count 不变的情况下,不会进行重复的计算,直接使用上次的值

const arr = useMemo(() => {  const temp = [];  for (let i = 0; i < count; i++) {    if (i % 2 === 0) {      temp.push(i);    }  }  return temp;}, [count]);

useCallback、React.memo

既然讲到 useMemo 了,那么 useCallback、React.memo 也顺便说下吧,一个效果的东西,只不过将返回的值从对象变成了函数或者组件

  • React.memo:当其作用于函数式组件并且作为子组件时, 每次父组件更新后, 会浅对比传来的 props 是否变化, 若没变化, 则子组件不更新

  • useCallback:作用和 useMemo 一致,返回一个函数

下面看个小栗子:

// 父组件代码:一个计时器每秒更新时间,父组件每秒不停的 re-render,改变 count 值的 onCountChange 函数传入子组件import React, { useState, useEffect, useCallback } from 'react';import Child from './child';export default () => {  const [count, setCount] = useState(100);  const [curTime, setCurTime] = useState('');  const useTime = () => {    useEffect(() => {      const intervalId = window.setInterval(() => {        let time = new Date();        setCurTime(time.toLocaleString());      }, 1000);      return () => {        window.clearInterval(intervalId);      };    }, []);    return curTime;  };  const time = useTime();  const onCountChange = () => {    setCount((count) => count + 100);  };  console.log('re-render-father');  return (    <>      <div>{time}</div>      <div>{count}</div>      <Child onCountChange={onCountChange} />    </>  );};// 子组件代码,接收 onCountChange 函数,并且用 React.memo 包裹函数import React from 'react';export default React.memo((props: any) => {  const { onCountChange } = props;  console.log('re-render-child');  return (    <>      <div        onClick={() => {          onCountChange();        }}      >        加100      </div>    </>  );});

分析一下上面的栗子:

  • 现象:父组件和子组件都会不停的 re-render

  • 我子组件加了 React.memo ,虽然父组件因为计时器在不停的 re-render,但是我每次传入 onCountChange 的函数都是一样的啊,不是说比较 props 没变就不会 re-render 吗???为啥也会不停的 re-render 呢

原因:父组件在不停的 re-render 每次都会重新创建函数,在 js 中虽然两个函数一模一样,但是不是一个引用的话就不相等,所以 React.memo 在进行浅比较的时候就认为 props 变化了,子组件也会 re-render,造成了无效优化

解决办法:既然知道了原因所在,那我们如何解决呢,那就让它是同一个函数不就好了,那就用到了 useCallback 进行优化

const onCountChange = useCallback(() => {  setCount((count) => count + 100);}, []);

或者可以用 useMemo:返回变成函数即可

const onCountChange = useMemo(() => {  return () => {    setCount((count) => count + 100);  };}, []);

由此可见 useCallback 为 useMemo 的语法糖而已

将函数用 useCallback 包裹一样就会使用缓存的值,不会重新创建函数,也就不会重复 re-render 组件了。

以上就是“react中的useMemo怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: react中的useMemo怎么使用

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

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

猜你喜欢
  • react中的useMemo怎么使用
    今天小编给大家分享一下react中的useMemo怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。概念react 中是...
    99+
    2023-07-04
  • React useMemo和useCallback的使用场景
    目录useMemouseCallback useMemo 我们知道当父组件发生重新渲染时,其所有(状态、局部变量等)都是新的。一旦子组件依赖于父组件的某一个对象变量,那么无论对象是否...
    99+
    2024-04-02
  • React useMemo和useCallback的使用情景
    这篇文章主要讲解了“React useMemo和useCallback的使用情景”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React useMemo和useCallback的使用情景”吧...
    99+
    2023-06-14
  • React 中 memo useMemo useCallback 到底该怎么用
    目录React.memo怎么用React.useMemo怎么用React.memo()和useMemo()的主要区别React.useCallback怎么用memo与useMemo及...
    99+
    2022-11-13
    React memo useMemo useCallback React useMemo useCallback
  • React中memo、useCallback和useMemo的使用场景是什么
    这篇“React中memo、useCallback和useMemo的使用场景是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2023-07-05
  • React 正确使用useCallback useMemo的方式
    目录正确使用useCallback useMemo的姿势useCallbackuseMemo总结正确使用useCallback useMemo的姿势 说起useCallback us...
    99+
    2022-11-13
    React 使用useCallback useMemo方式 React  useCallback useMemo
  • 详解React中的useMemo和useCallback的区别
    目录前言useMemouseCallback优化的方向不同总结:前言 React中的useMemo和useCallback是两个重要的Hooks。常常被用于优化组件的性能。虽然这两个...
    99+
    2023-05-17
    React useMemo和useCallback区别 useMemo和useCallback区别
  • 六分钟带你快速学会react中的useMemo
    目录概念useMemo栗子筛选偶数每秒获取时间刷新页面如何优化useCallback、React.memo总结概念 react 中是通过一次次的 re-render (重新渲染)保持...
    99+
    2022-12-23
    react usememo react usememo原理
  • react中的key怎么使用
    这篇“react中的key怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“react...
    99+
    2024-04-02
  • React中的ref怎么使用
    这篇文章主要介绍“React中的ref怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React中的ref怎么使用”文章能帮助大家解决问题。1. ref 的理解与使用对于 Ref 的理解,要从...
    99+
    2023-07-04
  • react中怎么使用super
    今天小编给大家分享的是react中怎么使用super,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。 react中可以使用...
    99+
    2024-04-02
  • react中context怎么使用
    今天小编给大家分享一下react中context怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2024-04-02
  • React中key怎么使用
    这篇文章给大家分享的是有关React中key怎么使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在渲染列表时,React的差异比较算法需要一个在列表范围内的唯一key来提高性能...
    99+
    2024-04-02
  • react中map怎么使用
    这篇文章主要介绍了react中map怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇react中map怎么使用文章都会有所收获,下面我们一起来看看吧。react中map的用法:1、使用“{this.sta...
    99+
    2023-07-04
  • React中的setState/useState怎么使用
    这篇文章主要介绍“React中的setState/useState怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React中的setState/useState怎么使用”文章能帮助大家解决问...
    99+
    2023-07-05
  • React.memo和useMemo的使用问题小结
    目录问题背景useMemo 进行优化React.memo 进行优化props的值是基本类型props的值是引用类型写在最后问题背景 大家在使用 React 框架进行开发时一定遇到过以...
    99+
    2022-11-13
    React.memo useMemo React.memo useMemo使用
  • props怎么在react中使用
    这篇文章给大家介绍props怎么在react中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。组件的props( props是一个对象 )作用:接收传递给组件的数据特点:可以给组件传递任意类型的数据props是只读的...
    99+
    2023-06-14
  • Hook怎么在React中使用
    Hook怎么在React中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、useState:让函数式组件拥有状态用法示例:// 计数器impor...
    99+
    2023-06-14
  • 怎么在React中使用Hooks
    这篇文章给大家介绍怎么在React中使用Hooks,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、State Hook1、基础用法function State(){  const&nbs...
    99+
    2023-06-14
  • hooks怎么在react中使用
    hooks怎么在react中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。State Hooks案例:import { useState }&...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作