useMemo和useCallback

news2024/10/7 19:17:14

在这里插入图片描述

上述代码中,useSate 用于定义了三个状态:supNumoppNumx。在组件函数中,我们根据这些状态来计算投票的支持率,并将其渲染到视图中。但是,每次状态变化时,投票支持率的计算都会重新执行,即使其他状态(比如 x)的变化并不影响支持率的计算。

为了更好地优化性能,我们可以使用 useMemo 钩子在支持人数或反对人数发生变化时,重新计算投票支持率。例如,可以这样重构代码:

import React, { useState, useMemo } from "react";
import { Button } from 'antd';
import './Demo.less';

const Demo = () => {
  const [supNum, setSupNum] = useState(10);
  const [oppNum, setOppNum] = useState(5);
  const [x, setX] = useState(0);

  const ratio = useMemo(() => {
    const total = supNum + oppNum;
    return total > 0 ? ( supNum / total * 100).toFixed(2) + '%' : '--';
  }, [supNum, oppNum]);

  return (
    <div className="vote-box">
      <div className="main">
        <p>支持人数:{supNum}</p>
        <p>反对人数: {oppNum}</p>
        <p>支持比率: {ratio}</p>
        <p>x:{x}</p>
      </div>
      <div className="footer">
        <Button type="primary" onClick={() => setSupNum(supNum + 1)}>支持</Button>
        <Button type="primary" danger onClick={() => setOppNum(oppNum + 1)}>反对</Button>
        <Button onClick={() => setX(x + 1)}>干点别的事</Button>
      </div>
    </div>
  );
}

在上述代码中,我们把计算投票支持率的逻辑放在了 useMemo 内部,通过依赖项数组来指定只有在支持人数supNum或反对人数oppNum发生变化时才重新计算。这样,就可以避免在其他状态(比如 x)发生变化时不必要地重新计算支持率。

思考缓存在哪里??

useMemo 钩子缓存的计算结果是存在内存中的,而不是浏览器中。具体来说,缓存计算结果是存在 React 内部的某个地方,这个地方是不可访问和控制的,仅限于 React 内部使用。

当组件重新渲染时,useMemo 钩子会判断依赖项数组中的值是否发生了变化。如果依赖项数组中的值与前一次渲染时的值不同,useMemo 钩子会调用计算函数,计算新的结果,并将结果缓存起来。如果依赖项数组中的值没有发生变化,useMemo 钩子就会直接返回上一次缓存的结果,避免重复计算。

需要注意的是,缓存的计算结果是存在内存中的,如果缓存的结果占用较大的内存空间,可能会导致组件的内存占用过高,从而影响应用的性能和稳定性。因此,在使用 useMemo 钩子时,要注意控制缓存大小,避免大量占用内存。

这个缓存是全局变量吗??

不是。相比全局变量,useMemo 钩子的缓存是更加局部的,它仅对当前组件实例内部可见和生效,不会影响到其他组件或全局变量。

举个例子,如果在一个 React 应用中有多个组件都使用了 useMemo 钩子来缓存计算结果,那么每个组件的计算结果都是独立存在的,不会互相干扰或影响其他组件。

而全局变量具有全局范围的作用域,多个组件或模块都可以访问和修改它,容易导致命名冲突和意外修改,造成不可预料的错误。

因此,使用 useMemo 钩子来缓存计算结果,既可以提高性能,又不会对其他组件造成影响,是一种更加优雅、可控、安全的方式。


useCallback

const xxX = useCallback( callback, [dependencies] )

组件第一次渲染,useCallback执行,创建一个函数"callback",赋值给×××

组件后续每一次更新,判断依赖的状态值是否改变,如果改变,则重新创建新的函数堆,赋值给xxX,但是如果,依赖的状态没有更新「或者没有设置依赖“[]"」则xxx获取的一直是第一次创建的函数堆,不会创建新的函数出来!!

useCallback不要乱用!并不是所有组件内部的函数,都拿其处理会更好!!+虽然减少了堆内存的开辟但是useCallback本身也有自己的处理逻辑和缓存的机制,这个也消耗时间啊

啥时候用它呢?
父组件嵌套子组件,父组件要把一个内部的函数,基于属性传递给子组件,此时传递的这个方法,我们基于useCallback处理一下会更好!!

在这里插入图片描述
父组件更新导致我们的子组件函数的地址发生改变,子组件就跟着跟新了!!!!如何解决??

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++深搜1-迷宫类问题

目录 1.问题引入 2.知识讲解 3.例题解析 【例题1】迷宫的第一条出路。 题目描述 输入格式 输出格式 样例 输入数据#1 输出数据#1 输入数据#2 输出数据#2 【例题2】迷宫的所有路径。 【例题3】走出迷宫的最少步数。 1.问题引入 拓拓小时候玩迷宫游戏时&#xff…

小酷智慧地图3D导公众号小程序 v1.0.50+前端

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; &#x1f389; 有需要的朋友记得关赞评&#xff0c;阅读文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 小酷智慧地图3D导览系统适用于城市或乡镇全…

性能测试之全链路压测实战理论详解

目录 前言 01为什么需要全链路压测&#xff1f; 02全链路压测解决了哪些问题&#xff1f; 03哪些业务场景适合做 04基础技术组件 05小结 前言 要说当下研发领域最热门的几个词&#xff0c;全链路压测 肯定跑不了。最近的几次大会上&#xff0c;也有不少关于全链路的议题。…

Vue项目中使用MapboxGL开发3D地图教程(一)MapboxGL介绍以及前期vue项目的搭建

MapboxGL介绍以及前期vue项目的搭建 1、Mapbox-gl简介2、搭建vue项目2.1、创建vue项目2.2、注册mapbox官网2.3、mapbox-gl入门案例 3、Mapbox-gl地图主要配置参数说明 1、Mapbox-gl简介 Mapbox-gl是一个开源、基于webgl技术的前端地图类库。 地图数据渲染和可视化这块我们经常用…

第七章 详细设计

结构化程序设计的基本结构包括 顺序结构、选择结构、循环结构 三种。 详细设计层 详细设计概览 详细设计的任务&#xff1a;定义每一模块 三种控制结构&#xff1a;顺序、选择、循环 伪码 伪码是一种混合语言。外 部采用形式语言定义控制 结构和数据结构&#xff0c;内部使…

OpenGL光照之投光物

文章目录 平行光点光源衰减实现衰减 聚光手电筒平滑/软化边缘完整代码 我们目前使用的光照都来自于空间中的一个点。它能给我们不错的效果&#xff0c;但现实世界中&#xff0c;我们有很多种类的光照&#xff0c;每种的表现都不同。将光投射(Cast)到物体的光源叫做投光物(Light…

算法提高-图论- 最小生成树的扩展应用

最小生成树的扩展应用 最小生成树的扩展应用AcWing 1146. 新的开始AcWing 1145. 北极通讯网络AcWing 346. 走廊泼水节AcWing 1148. 秘密的牛奶运输 最小生成树的扩展应用 AcWing 1146. 新的开始 利用虚拟源点建图和原题的题意是等价的&#xff0c;因此我们使用虚拟源点建图套…

主从架构lua脚本-Redis(四)

上篇文章介绍了rdb、aof持久化。 持久化RDB/AOF-Redis&#xff08;三&#xff09;https://blog.csdn.net/ke1ying/article/details/131148269 redis数据备份策略 写job每小时copy一份到其他目录。目录里可以保留最近一个月数据。把目录日志保存到其他服务器&#xff0c;防止机…

服务器网站搭建(一)

文章目录 环境搭建域名购买和解析创建网站环境搭建 一台服务器,我买的腾讯云新加坡的。根据需求选择配置。 重置密码: 自己设置的密码要记住: 登录: 安装宝塔(centos系统),参考官网: https://www.bt

Python 接口测试框架

目录结构定义 首先来看一下项目整体的结构 框架结构 代码结构 Excel 文件结构 代码详细解析 1.工具包 tools 封装操作 excel 方法 excel_operation.py import xlrd from config.config import PROJECT_PATHclass OperationExcel:def __init__(self, file_nameNone, sheet_…

县村快递物流小程序 v1.2.63+前端(本站修复版)

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; &#x1f389; 有需要的朋友记得关赞评&#xff0c;文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 核心功能&#xff1a; 1、县分拣中心入库出库 2…

什么是Vue的脚手架(Vue CLI)?

什么是Vue的脚手架&#xff08;Vue CLI&#xff09;&#xff1f; Vue.js 是一款流行的 JavaScript 框架&#xff0c;用来构建现代的单页面应用程序&#xff08;SPA&#xff09;。Vue.js 的核心库提供了丰富的功能和 API&#xff0c;但是创建一个完整的应用程序需要更多的工具和…

浏览器插件 | Font Picker - 网页字体识别工具

目录 软件简介 Font Picker插件背景 Font Picker插件离线安装教程 Font Picker 小结 软件简介 Font Picker 插件是一款用于 Chrome 浏览器的字体选择器&#xff0c;这种网页字体识别工具看起来非常的干净&#xff0c;使用起来也十分的简单。本文提供Font Picker网页字体…

d3dcompiler_43.dll文件丢失怎么修复,最新修复方法分享

本教程操作系统&#xff1a;Windows系统、 d3dcompiler_43.dll是电脑文件中的dll文件&#xff08;动态链接库文件&#xff09;。如果计算机中丢失了某个dll文件&#xff0c;可能会导致某些软件和游戏等程序无法正常启动运行&#xff0c;并且导致电脑系统弹窗报错。 在我们打开…

【LeetCode】110. 平衡二叉树

110. 平衡二叉树&#xff08;简单&#xff09; 思路 对二叉树做先序遍历&#xff0c;从底至顶返回子树最大高度&#xff0c;若判定某子树不是平衡树则“剪枝”直接向上返回。 递归返回值&#xff1a; 当节点 root 左、右子树的高度差 > 1&#xff1a;返回 -1&#xff0c;代…

吴恩达471机器学习入门课程1第1周

文章目录 1加载数据集2计算COST(均值平方差&#xff0c;1/2m(y_pre - y))3计算梯度4画出成本曲线5梯度下降 import math, copy import numpy as np import matplotlib.pyplot as plt plt.style.use(./deeplearning.mplstyle) from lab_utils_uni import plt_house_x, plt_conto…

OpenMMLab-AI实战营第二期——4-2.MMDetection代码课

文章目录 1. MMDetection介绍&#xff08;vs MMSegmentation&#xff0c;mmdetection3d&#xff09;2. 代码2.1 使用pycocotools配合exif可视化图像2.2 mmdetection中config的继承2.3 mmdet的数据集可视化问题&#xff08;VISUALIZERS&#xff09;2.4 pin_memory参数设置2.5 ma…

康佳液晶电视(非智能)Mstar V56 芯片

&#xfffc;&#xfffc; &#xfffc; &#xfffc; &#xfffc; 2023/6/11 下午8:10:01 康佳用的地面波数字电视解码芯片是&#xff1f; &#xfffc; 2023/6/11 下午8:10:08 康佳电视使用的地面波数字电视解码芯片可能因不同的产品型号而有所不同。然而&#xff0c;根据…

【AI作画】使用DiffusionBee with stable-diffusion在mac M1平台玩AI作画

DiffusionBee是一个完全免费、离线的工具。它简洁易用&#xff0c;你只需输入一些标签或文本描述&#xff0c;它就能生成艺术图像。 DiffusionBee下载地址 运行DiffusionBee的硬性要求&#xff1a;MacOS系统版本必须在12.3及以上 DBe安装完成后&#xff0c;去C站挑选自己喜欢…

ur机器人在moveit中运行环境搭建(保姆级)

ur机器人在moveit中运行环境搭建 我的系统是ubuntu20.04 rosb版本: noetic 1.安装运动学插件 sudo apt-get install ros-noetic-trac-ik-kinematics-plugin 2.安装 eigenpy 需要单独编译,EigenPy是一个用于在Python中使用Eigen库的绑定库 git clone https://github.com/…