React.memo()、userMemo 、 userCallbank的区别及使用

news/2024/10/23 18:58:52/

本文是对以下课程的笔记输出,总结的比较简洁,若大家有不理解的地方,可以通过观看课程进行详细学习;

React81_React.memo_哔哩哔哩_bilibili

React76_useEffect简介_哔哩哔哩_bilibili

React136_useMemo_哔哩哔哩_bilibili

React.memo()

性能优化

export default function App() {console.log('App渲染')const [count, setCount] = useState(1)const clickHandler = () => {setCount(prevState => prevState + 1)}// 增加const test = count % 4 === 0return (<div><h2>App -- {count}</h2><button onClick={clickHandler}>增加</button>{/* 改动 */}<A test={test} /></div>)
}const A = React.memo(props => {console.log('A渲染')return (<div>我是A组件{/* 增加 */}<p>{props.test && 'props.test 为 true'}</p></div>)
})

对代码进行解释:

一开始是false,只有为true的时候,A组件才会重新渲染。

若不加 React.memo,当APP组件重新渲染时,A组件也会重新渲染。A组件中没有state,甚至连props都没有设置。换言之,A组件无论如何渲染,每次渲染的结果都是相同的,虽然重渲染并不会应用到真实DOM上,但很显然这种渲染是完全没有必要的

但若对代码进行如下修改,

这是因为App组件重新渲染的时候,clickHandler也重新创建了,这时传递给子组件的clickHandler和上一次不一样,所以react.memo失效了。

这个问题可以用useCallback解决。

useCallback

import React, { useState } from 'react'export default function App() {console.log('App渲染')const [count, setCount] = useState(1)const clickHandler = () => {setCount(prevState => prevState + 1)}return (<div><h2>App -- {count}</h2><button onClick={clickHandler}>增加</button><A clickHandler={clickHandler} /></div>)
}const A = React.memo(props => {console.log('A渲染')return (<div>我是A组件<button onClick={props.clickHandler}>A组件的增加</button></div>)
})

 用法介绍

/*
*   useCallback()
*        这个hook会缓存方法的引用
*       参数:
*           1. 回调函数
*           2. 依赖数组
*               - 当依赖数组中的变量发生变化时,回调函数才会重新创建
*               - 如果不指定依赖数组,回调函数每次都会重新创建
*               - 一定要将回调函数中使用到的所有变量都设置到依赖数组中
*                   除了(setState)
* */

引出useCallback


import React, { useState, useCallback } from 'react'export default function App() {console.log('App渲染')const [count, setCount] = useState(1)// 增加const [num, setNum] = useState(1)const clickHandler = useCallback(() => {setCount(prevState => prevState + num)// 增加setNum(prevState => prevState + 1)}, [num])return (<div><h2>App -- {count}</h2><button onClick={clickHandler}>增加</button><A clickHandler={clickHandler} /></div>)
}const A = React.memo(props => {console.log('A渲染')return (<div>我是A组件<button onClick={props.clickHandler}>A组件的增加</button></div>)
})

 界面图

点击了两次增加后,count变成了预期值4。

第二个参数一定要加,不然和平常写没有区别 依赖项[]的意思是只有第一次渲染时才会创建,之后都不会重新创建了

useMemo

useMemo和useCallback十分相似,useCallback用来缓存函数对象,useMemo用来缓存函数的执行结果。在组件中,会有一些函数具有十分的复杂的逻辑,执行速度比较慢。闭了避免这些执行速度慢的函数返回执行,可以通过useMemo来缓存它们的执行结果,像是这样:

const result = useMemo(()=>{return 复杂逻辑函数();
},[依赖项])

useMemo中的函数会在依赖项发生变化时执行,注意!是执行,这点和useCallback不同,useCallback是创建。执行后返回执行结果,如果依赖项不发生变化,则一直会返回上次的结果,不会再执行函数。这样一来就避免复杂逻辑的重复执行。

  React.useEffect(() => {//中括号内有参数  可理解为watch  没有参数  可理解为created}, [])//等中括号里的数据变化时  执行该操作  有返回值  这直接在页面中使用  类似于compunted  //中括号里没有值时  加载时触发 只走一次const useNum=React.useMemo(()=>{return num+1},[num])  

参考笔记:Learning-Notes/15【react-Hook (下)】.md at master · dselegent/Learning-Notes · GitHub


http://www.ppmy.cn/news/211400.html

相关文章

本地JSON格式化工具下载

三年前做开发的时候用的这个&#xff0c;非常好用&#xff1a; JsonView&#xff1a; 下载地址&#xff1a;https://pan.baidu.com/s/1pLJumGb https://blog.csdn.net/u010429286/article/details/78857302

微信小程序开发工具下载安装

登录官方文档&#xff1a;https://developers.weixin.qq.com/doc/ 点击小程序进入小程序页面&#xff0c;然后点击开发再点击工具进入工具页面。 点击下载&#xff0c;下载稳定版。&#xff08;其他版本也可用&#xff0c;只是不稳定&#xff0c;建议下载稳定版&#xff09;

前端工具下载

前端工具下载 git 下载 https://npm.taobao.org/mirrors/git-for-windows/ 选择Git-xxx-64-bit.exe 文件 vscode 下载官网https://code.visualstudio.com/ 获取到文件下载地址&#xff0c;将/stable地址之前的地址换为如下内容&#xff1a;http://vscode.cdn.azure.cn /stable…

MRT(MODIS Reprojection Tool) 工具下载及安装教程

MRT(MODIS Reprojection Tool) 工具下载及安装教程 数据下载 链接&#xff1a;https://pan.baidu.com/s/1DKUlQ9AULG2p6-wFjqbatQ 提取码&#xff1a;8fiw 安装步骤 ①点击mrt_install.bat 出现以下界面 ②点击任意键&#xff0c;出现以下界面。输入要安装 MRT 的绝对路径…

利用浏览器开发者工具下载歌曲

利用浏览器F12下载音乐 翻出了老旧的账号&#xff0c;别看码龄2年&#xff0c;其实一点啥也不会&#xff0c;目前扎进学习中&#xff0c;以此记录学习过程 最近学习了浏览器开发者控制台&#xff0c;快捷键F12 红框所示 接下来实战如何在没有会员的情况下、下载VIP才能下载的…

Android启动之生命周期流程

目录 一、简述 二、启动流程说明(一) 三、启动流程说明(二) 四、ServerThread常用组件的功能介绍 一、简述 第一步&#xff1a;启动Linux&#xff1a; 1.Bootloader 2.kernel 第二步&#xff1a;Android系统启动&#xff1a;入口为Init.rc(system/core/rootdir) 1./sy…

APT 下载工具

APT 下载工具可以实现软件自动下载、配置、安装二进制或者源码的功能。 APT 下载工具install命令结合在一起构成了 Ubuntu 下最常用的下载和安装软件方法。它解决了 Linux 平台下安装软件的一个缺陷&#xff0c;即软件之间相互依赖。APT 采用的 C/S 模式&#xff0c;也就是客户…

JD-GUI工具下载安装

jd-gui是一款可以反编译class文件的工具&#xff0c;有图形化界面&#xff0c;对于开发者来说非常好用。 下载地址&#xff1a;Releases java-decompiler/jd-gui 下载地址2&#xff1a;https://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/JD-G…