当前位置: 首页 > news >正文

React Hook 总结(React 萌新升级打怪中...)

1 useCallback

useMemo 和 useCallback 接收的参数都是一样,都是在其依赖项发生变化后才执行,都是返回缓存的值,区别在于 useMemo 返回的是函数运行的结果,useCallback 返回的是函数。

当需要使用 useCallback 的情况通常包括以下几种情形:

(1)将回调函数作为 prop 传递给子组件:在这种情况下,使用 useCallback 可以确保子组件在父组件重新渲染时不会不必要地重新渲染。

import React, { useCallback } from 'react';const ParentComponent = () => {const handleClick = useCallback(() => {console.log('Button clicked!');}, []);return <ChildComponent onClick={handleClick} />;
};const ChildComponent = ({ onClick }) => {return <button onClick={onClick}>Click me</button>;
};

(2)优化依赖项变化引起的重新渲染:在 useEffect 中使用 useCallback 可以避免不必要的重新执行。

import React, { useState, useEffect, useCallback } from 'react';const ExampleComponent = () => {const [count, setCount] = useState(0);const handleIncrement = useCallback(() => {setCount(count + 1);}, [count]);useEffect(() => {console.log('Count changed:', count);}, [handleIncrement]);return (<div><p>Count: {count}</p><button onClick={handleIncrement}>Increment</button></div>);
};

(3)避免不必要的函数创建:在需要动态生成函数的场景下,使用 useCallback 缓存函数。

import React, { useCallback } from 'react';const ExampleComponent = () => {const generateRandomNumber = useCallback(() => {return Math.floor(Math.random() * 100);}, []);return (<div><p>Random number: {generateRandomNumber()}</p></div>);
};

注意: useCallBack不要每个函数都包一下,否则就会变成反向优化,useCallBack本身就是需要一定性能的
useCallBack并不能阻止函数重新创建,它只能通过依赖决定返回新的函数还是旧的函数,从而在依赖不变的情况下保证函数地址不变。useCallBack你真的知道怎么用吗。

2 useMemo

useMemo 可以在函数组件 render 上下文中同步执行一个函数逻辑,这个函数的返回值可以作为一个新的状态缓存起来。

场景一:在一些场景下,需要在函数组件中进行大量的逻辑计算,那么我们不期望每一次函数组件渲染都执行这些复杂的计算逻辑,所以就需要在 useMemo 的回调函数中执行这些逻辑,然后把得到的产物(计算结果)缓存起来就可以了。
场景二:React 在整个更新流程中,diff 起到了决定性的作用,比如 Context 中的 provider 通过 diff value 来判断是否更新

缓存计算结果:

function Scope(){const style = useMemo(()=>{let computedStyle = {}// 经过大量的计算return computedStyle},[])return <div style={style} ></div>
}

缓存组件,减少子组件 render 次数:

function Scope ({ children }){const renderChild = useMemo(()=>{ children()  },[ children ])return <div>{ renderChild } </div>
}

参考

「React 进阶」 React 全部 Hooks 使用大全 (包含 React v18 版本 )

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python打包exe文件-实现记录
  • Linux下如何安装配置Elastic Stack日志收集系统
  • 【Rust光年纪】解锁Rust语言核心库奥秘:加密、数字签名和数据库操作全面解析
  • spark 动态资源分配dynamicAllocation
  • Linux cd 和 pwd 命令
  • ESP8266模块(2)
  • [图解]《分析模式》漫谈16-“我用的”不能变成“我的”
  • python基础知识点(蓝桥杯python科目个人复习计划71)
  • C的预编译指令
  • LabVIEW和Alicat Scientific质量流量计实现精确流量控制
  • 2024 React 和 Vue 的生态工具
  • STM32之八:IIC通信协议
  • 【数据分享】2013-2022年我国省市县三级的逐年SO2数据(excel\shp格式\免费获取)
  • websocket状态机
  • 关于正运动学解机器人手臂算法
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • cookie和session
  • ERLANG 网工修炼笔记 ---- UDP
  • go语言学习初探(一)
  • js面向对象
  • Linux gpio口使用方法
  • mac修复ab及siege安装
  • Making An Indicator With Pure CSS
  • Markdown 语法简单说明
  • Object.assign方法不能实现深复制
  • OSS Web直传 (文件图片)
  • Otto开发初探——微服务依赖管理新利器
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • underscore源码剖析之整体架构
  • vue的全局变量和全局拦截请求器
  • vue学习系列(二)vue-cli
  • 从重复到重用
  • 大数据与云计算学习:数据分析(二)
  • 前端临床手札——文件上传
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 用jQuery怎么做到前后端分离
  • 函数计算新功能-----支持C#函数
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #大学#套接字
  • (2022 CVPR) Unbiased Teacher v2
  • (8)STL算法之替换
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)丶RabbitMQ的六大核心
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (回溯) LeetCode 131. 分割回文串
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (四)事件系统
  • (转)Linux下编译安装log4cxx