React hooks 优化指北

React hook钩子&性能优化Hooks的面试常考题目 根据,提到了常用的Hooks有,还有其他如。和也提到了类似的Hooks,并且强调了useEffect的重要性。详细解释了useState、useEffect、useMemo和useCallback的区别,特别是useEffect和Vue的watch类似。则补充了React18中的新Hooks,如useDeferredValue、useTransition、useId等,这些可能在面试中也会被问到。接下来需要考虑面试中常考的问题类型。 阅读详情

写在开头

  • 阅读之前:希望您知道基础hooks的使用,如useCallback,useReducer等,我并不会过多的介绍文章中出现的hooks。
  • 注释的问题:为了表达的更清楚,在有的React代码片段中,我会添加注释来解释一些东西,为了方便书写,在jsx中我使用的是//而不是{ /*  */ },请忽略这个错误。

从一个简单的useToggle开始

相信大家都使用过复选框或者开关组件,我们实现一个useToggle()让事情变的更简单

function App() {
   
   
  const [on, toggle] = useToggle();
  //on是状态,toggle切换状态
  ...
}

简单实现

import React from 'react';
export function useToggle(on: boolean): [boolean, () => void] {
   
   
  const [_on, setOn] = React.useState(on);
  return [_on, () => {
   
   setOn(!_on)}]
}

现在这个useToggle已经可以投入使用了,有一个小问题不知道各位观察到没有?每次on状态的改变,都会导致我们重新返回新的toggle方法,当然简单使用的话其实并没有什么影响。

尝试优化useToggle

现在我们有了新的需求,尝试优化一下useToggle来实现它。

例如:

function App() {
   
   
  const [on, toggle] = useToggle();
  return(
    <div>
      //NeedOn仅需要使用on状态
      <NeedOn on ={
   
   on}></NeedOn>
      //Button组件仅负责修改on的状态
      <Button toggle = {
   
   toggle}></Button>
    </div>
  )
}

在上面的例子中,我们有两个组件,NeedOn仅需要使用on状态,Button仅负责修改on的状态。

而现在每一次on的改变都会引起App的重新渲染,进而导致NeedOn和Button的重新渲染。现在我们需要在功能不变的情况下使on改变时,Button不再重新渲染。

如何解决呢?首先我们要解决toggle改变的问题,因为一个组件不在重新渲染的基础条件之一就是它的props不再改变。我们可以使用useCallback()来解决这个问题。

import React from 'react';
export function useToggle(on: boolean): [boolean, () => void] {
   
   
  const [_on, setOn] = React.useState(on);
  const _toggle = React.useCallback(() => {
   
   
    setOn(!_on);
  },[])
  return [_on,_toggle];
}
//现在我们使用了useCallback来缓存_toggle。
//由于传入数组为空_toggle再也不会被更新了,现在我们再也不用担心Button组件进行多余的渲染了。
// -> -> ->                                                                                                               如果您觉得这段代码没问题,那您可能需要重新学习一下hooks了

上述代码确实没有渲染的问题了,但是出现了一个更加严重的问题:代码逻辑错误

我们浅浅的测试一下。

在线测试

//测试代码,可跳过
//默认on为true,调用4次toggle,期望结果为:[true, false, true, false, true]
function useToggle(on = true){
   
   
  const [_on, setOn] = React.useState(on);
  const _toggle = React.useCallback(() => {
   
   
    setOn(!_on);
  }, [])
  return [_on, _toggle];
}
const values = [];
const App = () => 
深入探索 React Hooks:原理、用法与性能优化全解 本文深入解析 React Hooks,包括其出现背景、基本 Hooks(useState、useEffect)用法与规则、高级用法(自定义 Hooks、useReducer、useContext)、性能优化(useEffect依赖项、useMemo和useCallback),重点分析useEffect工作原理及对this指向问题的解决。 阅读详情

相关推荐

React Hooks面试题

React Hooks面试题整理 React 加入 Hooks 的意义是什么?为什么 React 要加入Hooks 这一特性? if else条件判断里使用hooks有什么问题 hooks闭包的坑有哪些?如何解决 常用的Hooks有哪些? useEffect为什么有时候会出现无限重复请求的问题 useEffect的依赖项里类数组根据什么来判断有没有值变化 React Hooks api的原理: React Hooks如何模拟组件生命周期? 模拟的生命周期和class中的生命周期有什么区

m0_67265919的博客 2724

【React】React全家桶(五)React Hooks

【React】React全家桶(五)React Hooks

Better_Xing的博客 4685

SAGA GIS英文版进行地形分析,计算常用的地形因子等

SAGA GIS中文版是一款专业的自动化地球科学分析系统软件。SAGA GIS最新版界面简洁,操作简便,用户使用时输入要分割的影像,选择要计算特征的影像或者波段,设置越大,得到的斑块越大;反之,则越小,点击Okay,得到分割影像图。SAGA GIS中文版主要通过选择适合你影像的格式,加载影像。 SAGA GIS全称是System for Automated Geoscientific Analyses,是一种用于编辑空间数据的地理信息系统(GIS)计算机程序,它是免费的开源软件,SAGA GIS旨在为科学家

qq_35794085的博客 5640

【白话系列】倍增算法

【序言】         我认为吧,所有能够优化复杂度的算法都是神奇的,所有能够化繁琐为形象的文字都是伟大的。一直觉得倍增算法是个很神奇的东西,所以决定写点东西纪念一下它。但是作为一个非常不称职的OIER,我非常讨厌在看别人的算法解析时整版的i,j,k等我看到鼠标就惯性移到右上角的符号语言,所以我想用最形象的方式来纪念它。 【一】         从前,有一只可爱得不得了的小白兔,它想从

JarjingX 3万+

从ADS到Origin:高效绘制负载牵引Smith圆图的完整指南

本文提供了一份从ADS导出负载牵引数据并在Origin中绘制专业Smith圆图的完整指南。详细介绍了数据导出、导入、关键的数据解释步骤,以及高效处理多组曲线的技巧,帮助射频工程师快速生成用于报告和论文的出版级图表。

tgb3456789的博客 1135

主流仿真软件Sigrity/HFSS/Siwave/Hyperlynx/ADS差异

在电子设计自动化(EDA)领域,各种仿真软件如Cadence Sigrity、Mentor Graphics的HyperLynx、Keysight的ADS以及ANSYS的SIwave等,都广泛应用于不同的应用场景中。综上所述,这些EDA仿真软件在各自的应用场景中发挥着重要作用,帮助工程师在设计阶段就能够评估和优化电子产品的性能,提高设计的可靠性和效率。:Sigrity由全球最大的EDA公司Cadence推出,Cadence还推出了Orcad和Allegro等著名软件。:由安捷伦(现是德科技)公司开发。

Geektec的专栏 9399

从零部署思澈科技SiFli-Solution:避坑指南与实战排错

本文详细介绍了从零部署思澈科技SiFli-Solution开发环境的完整流程与实战排错指南。重点解析了Keil uVision5版本选择、Butterfli工具路径配置等关键步骤,并针对Keil路径报错、函数冲突等高频问题提供了具体解决方案,帮助开发者高效避坑,快速搭建稳定的嵌入式开发环境。

devops8pract的博客 529

【教程4>第2章>第18节】 GMSK调制系统的FPGA开发与matlab对比验证

GMSK(高斯最小频移键控)是一种连续相位的频移键控(CPFSK)调制方法,它在数字通信中得到了广泛应用,特别是在移动通信系统中。GMSK通过限制频率偏差的累积来减少带外辐射,并通过使用高斯滤波器对。

FPGA/MATLAB学习教程/源码/项目合作开发 998

LPDDR5 学习笔记08:电气参数设计要求

本文详细阐述了LPDDR5内存接口的关键电气规范和时序要求。主要内容包括:1)绝对最大额定值限制及长期工作可靠性说明;2)差分时钟信号(CK/WCK)的输入电压、转换速率和交叉点电压规范;3)单端时钟信号的定义和测量方法;4)时钟周期、抖动(周期抖动、相邻周期抖动)和累积误差的精确计算方法;5)片选信号在同步/异步模式下的接收器规范;6)命令地址信号和数据信号的接收器掩模定义及脉冲宽度要求。所有参数均严格定义了测量条件和合规标准,为LPDDR5接口设计提供了完整的电气规范参考。

一只豌豆象的博客 1174

[VT虚拟化驱动]正式启动VT

文章目录前言一、vmlaunch正式开始虚拟化二、使用步骤1.引入库2.读入数据总结 前言 本章开始真正实现一个最简单的VT框架,当然,只是能跑起来一个VT驱动了,没有并包括EPT,EPT后面再讲 提示:以下是本篇文章正文内容,下面案例可供参考 一、vmlaunch正式开始虚拟化 执行VMLAUNCH指令执行后,就正式进入虚拟化了,再该指令执行之前,得先保存Guest当前的环境,执行完VMLAUNCH后,要恢复Guest的环境,让Guest就像什么都没发生一样,所以需要保存和恢复Guest的各种寄存器的值

吾无法无天的博客 3661

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 如何优雅的手写a,b,c三兄弟
下一篇: 一直都在用的rgba与hex颜色系统你了解过吗?
达瓦利什
博客等级 码龄7年 256粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值