React学习-hooks

news2024/12/28 18:40:30

官方文档:https://zh-hans.react.dev/reference/react/useActionState

1.useEffect

useEffect(setup, dependencies?)

1.1 基础使用

//hooks
import { useEffect } from "react";
import "./App.css";

function App(){

  useEffect(()=>{
    console.log('useEffect loading');
  })

  return ( <h1>app</h1>)
}

export default App;

执行时机:
1,组件初始化
2,组件更新后执行(在dom更新之后执行)

1.2 传入依赖项时 []

  //第一个参数回调函数,组件初始化执行,组件更新后也会执行
  useEffect(()=>{
    console.log('useEffect loading');
  },[])

执行时机:
组件初始化、挂载

1.3 传入依赖项时 [a]

useEffect可以监听到useState的状态变化
(如果依赖项中传入多个值[a,b,c],只有有其中之一变化都会执行useEffect。或的关系)

import { useEffect, useState } from "react";
import "./App.css";

function App() {
  const [count, setCount] = useState(0);

  //第一个参数回调函数,组件初始化执行,组件更新后也会执行
  useEffect(() => {
    console.log("useEffect loading");
    console.log(count);

    // return () => {
    //   console.log('return 的函数在卸载的时候执行');
    // }
  }, [count]);

  const btn = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <h1>hooks</h1>
      <h1>{count}</h1>
      <button onClick={btn}>add</button>
    </div>
  );
}

export default App;

在这里插入图片描述

执行时机:
1,组件初始化、挂载
2,依赖项的状态变化时

1.4 第二个参数不传

第二个参数不传,会将所有定义的state值收集起来,只有有一个值变化了就会执行useEffect
在这里插入图片描述

1.5 返回的函数 ☆

执行时机:
1,组件卸载的时候
2,状态发生变化时

  useEffect(() => {
    console.log("useEffect loading",count);//变化后的数据
    
    return(()=>{//return 中的值是变化之前的数据
      console.log('return!!',count);
    })
  });

在这里插入图片描述

应用场景:用于聊天的卸载

用户我跟多个人聊天的场景:

伪代码:
跟用户A

function Bpp(){

  useEffect(() => {
	//userA
	connect(userA)
	
    return(()=>{
      console.log('return!!');
    })
    
  },[userA]);
}

离开A页面,到用户B

function Bpp(){

  useEffect(() => {
	//userB
	connect(userB)
	
    return(()=>{
    	//userA
      console.log('return!!');
      //断开A的连接
      disconnect(userA)
    })
    
  },[userB]);//A-->B
}

2.useState

const [state, setState] = useState(initialState)

import {  useState } from "react";
import "./App.css";

function App() {
  const [count, setCount] = useState(0)
  
  const btn=()=>{
    setCount(count+1)
  }

  return ( 
  <div>
    <h1>hooks</h1>
    <h1>{count}</h1>
    <button onClick={btn} >add</button>
  </div>
  )
}
export default App;

在这里插入图片描述

3.useLayoutEffect

useLayoutEffect(setup, dependencies?)

useLayoutEffect 是 useEffect 的一个版本,在浏览器重新绘制屏幕之前触发。

  useEffect(() => {
    console.log("useEffect loading",count);
  });

  useLayoutEffect(()=>{
    console.log('useLayoutEffect',0);
  })

在这里插入图片描述

在这里插入图片描述
应用场景:

4.性能优化:useMemo

useMemo 是一个 React Hook,它在每次重新渲染的时候能够缓存计算的结果。

useMemo 用于react渲染过程中的性能优化
适用于:父组件要进行更新,子组件的重新render计算量比较大,而且结果可以服用,就可以使用useMemo来缓存数据,提升父组件引起子组件不必要的渲染的性能优化。

注意点:在项目中一定是不得已才使用
1,useMemo本身具有性能消耗,缓存消耗内存,useMemo自身状态的维护也有性能开销
2,useMemo会增加开发成本,代码变得很复杂不好维护
3,react官方在未来会取消useMemo这个钩子

5.性能优化:useCallback

面试题

react的更新是同步还是异步的?为什么?

异步,因为react更新底层的(微任务)异步队列,会将短时间内js对组件的更新合并,1次渲染完成更新。

useEffect的执行时机?

看第一点

useEffect的返回函数执行时机

1,组件卸载的时候
2,状态发生变化时

应用场景:用于聊天的卸载

useEffect和useLayoutEffect区别?

useEffect(异步)是在commit的第一个阶段,js操作dom之前调用,但是在浏览器渲染完成之后调用。

useLayoutEffect(同步),js操作dom之后调用,在浏览器渲染之前。
在这里插入图片描述

useMemo作用?

useMemo 用于react渲染过程中的性能优化
适用于:父组件要进行更新,子组件的重新render计算量比较大,而且结果可以服用,就可以使用useMemo来缓存数据,提升父组件引起子组件不必要的渲染的性能优化。

什么时候使用useMemo?

注意点:在项目中一定是不得已才使用
1,useMemo本身具有性能消耗,缓存消耗内存,useMemo自身状态的维护也有性能开销
2,useMemo会增加开发成本,代码变得很复杂不好维护
3,react官方在未来会取消useMemo这个钩子

react渲染规律?

只要父组件进行setState,父组件本身会重新render,所有子组件也会重新render

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

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

相关文章

kaggle注册收不到验证码、插件如何下载安装

综合这三个来看&#xff0c; 1.插件下载用的大佬给的分享链接 2.下载好压缩包以后需要解压缩 Header Editor插件网盘下载安装教程 - 哔哩哔哩 (bilibili.com) 3.安装插件时没找到crx文件&#xff0c;在浏览器插件界面点击“加载解压缩的扩展” 4.复制网址到插件里&#xff…

基于IDEA快速重构代码的几种方式

文章目录 1. 方法重构1.1 操作方式1.2 优化方式 2. 类重构2.1 操作方式2.2 优化方式 3. 基于代码分析重构3.1 操作方式 4 基于重复代码重构4.1 操作方式 本篇主要基于AI工具 TONGYI Lingma, 静态代码分析工具 Qodana 进行讨论 1. 方法重构 当你对某个封装的方法不满意时, 借助…

在js渲染的dom中的事件中传递对象

在某些情况下&#xff0c;可能需要将整个对象或部分对象嵌入到 HTML 元素的属性中&#xff0c;可以将对象数据序列化为 JSON 字符串&#xff0c;存储在 data-* 自定义属性中。这样可以在事件中取出并解析对象数据&#xff1a; <!DOCTYPE html> <html lang"en&qu…

Ubuntu Python与GitHub API 交互,获取仓库更新信息

1. 获取 GitHub 个人访问令牌 登录 GitHub &#xff0c;首先使用帐户登录 GitHub 在 GitHub 页面右上角点击头像&#xff0c;然后选择 “Settings” 在左侧菜单栏滚动到最下方&#xff0c;找到并点击 “Developer settings” 在 “Developer settings” 页面中&#xff0c…

【笔记】数据结构08

文章目录 最小堆的构建 另一个树的子树找树左下角的值 折半查找的平均查找长度[顺序表] 画出折半查找树将关键字按完全二叉树形式画出查找树 l o g 2 n 1 log_2n1 log2​n112个结点画出高度为4的查找树 1层1个节点比较1次&#xff0c;2层2个节点比较2次&#xff0c;3层4个节点…

2024年高教杯国赛(A题)碰撞检测模型+最优螺距|数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

计算机,数学,AI在社会模拟中的应用

国家智囊团会使用社会模拟器来预测社会动向和一些问题的涌现&#xff0c;亚洲社会仿真学会&#xff08;ASSA&#xff09;最近在武汉成立&#xff0c;旨在推动大型社会模拟器的研发和应用。 未来随着计算机算力的提升以及人工智能的进化&#xff0c;我们每个人都可能在计算机中被…

如何通过学习英语,打出人生的‘王炸’?

如何通过学习英语&#xff0c;打出人生的‘王炸’&#xff1f; 每个人都渴望一张“王炸”牌&#xff0c;能瞬间改变人生的走向。有的人通过天赋&#xff0c;有的人依靠机遇&#xff0c;而今天我们要探讨的&#xff0c;是通过学习英语打出人生“王炸”的真实故事。英语&#xf…

DB2创建数据库-创建用户-赋值权限-导入数据

这篇文章主要内容以下几点&#xff1a; 1&#xff09;创建数据库 2&#xff09;创建用户 3&#xff09;给用户赋权限 4&#xff09;导入准备好的建表语句和数据 一、创建数据库 安装DB2数据库软件&#xff0c;在我另一篇文章写有&#xff0c;自己查看。这里不讲解安装。假设你…

react 使用Ant Design中DatePicker设置mode=“year“无法获取value

一、问题描述 <DatePicker placeholder"请选择年份" mode"year" onChange{this.onChange}/>// 使用上边代码&#xff0c;界面呈现出只有年份的选择器。但是&#xff0c; onChange 事件根本不会触发&#xff0c;获取不了值&#xff01;二、解决办…

【系统架构设计师-2011年】综合知识-答案及详解

更多内容请见&#xff1a; 备考系统架构设计师-核心总结索引 文章目录 【第1题】【第2~4题】【第5~7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18~19题】【第20~21题】【第22题】【第23题】【第24题】【第2…

【PyQt6 应用程序】解说+原声视频混剪无显卡精简版,无显卡可用

在当今视频内容创作日益繁荣的时代,利用自动化工具进行视频编辑和二次创作已成为提高生产效率和创作水平的重要手段。本文将介绍如何使用PyQt6创建一个应用程序,该程序能够自动提取视频中的解说和原声部分,并使用人工智能对解说进行二次创作,从而生成具有独特风格的新视频内…

[网络原理]关于网络的基本概念 及 协议

文章目录 一. 关于网络的概念介绍1. 局域⽹LAN2. ⼴域⽹WAN3. 主机4. 路由器5. 交换机IP地址端口号 二. 协议协议分层TCP/IP五层模型(或四层)OSI七层模型封装分用 一. 关于网络的概念介绍 1. 局域⽹LAN 局域⽹&#xff0c;即 Local Area Network&#xff0c;简称LAN。 Local …

会声会影2024是一款功能强大的专业视频制作软件及会声会影字体怎么安装

字幕在视频中扮演着多重角色&#xff0c;对于不同类型的观众都有重要意义。通过提供文字信息&#xff0c;字幕帮助观众更好地理解视频内容&#xff0c;特别是对于那些听力受损或不懂视频语言的观众来说&#xff0c;字幕是他们获取信息的重要途径。这篇文章就一起来看看会声会影…

面试高频:Mysql事务

在MySQL中&#xff0c;事务是用于管理数据库操作的一组语句&#xff0c;它们作为一个整体执行&#xff0c;以确保数据的一致性和完整性。事务提供了一种机制&#xff0c;可以将多个操作合并为一个原子单元&#xff0c;这样要么所有操作都成功执行&#xff0c;要么在出现错误时&…

HarmonyOS开发实战( Beta5版)合理使用动画丢帧规范实践

本文列举了部分用于优化动画时延的正反案例&#xff0c;帮助开发者在遇到相似场景时进行优化&#xff0c;解决构建页面动画时遇到动画时延较长的问题。 减少动画丢帧 在播放动画或者生成动画时&#xff0c;画面产生停滞而导致帧率过低的现象&#xff0c;称为动画丢帧。 播放…

《Learning To Count Everything》CVPR2021

摘要 论文提出了一种新的方法来解决视觉计数问题&#xff0c;即在给定类别中仅有少量标注实例的情况下&#xff0c;对任何类别的对象进行计数。将计数问题视为一个少样本回归任务&#xff0c;并提出了一种新颖的方法&#xff0c;该方法通过查询图像和查询图像中的少量示例对象…

【Linux高级命令】2_查看日志命令(重点)

文章目录 一、查看日志文件1.1 日志文件1.2 查看日志信息&#xff1a;head1.3 查看日志信息&#xff1a; tail【重点】1.4 工作中的使用场景 二、查看操作系统信息 一、查看日志文件 1.1 日志文件 就是一个文本文件 里面记录了程序运行的信息 作用 通过最后几行信息&#xff…

JIT编译:Java性能加速的关键技术

JIT&#xff08;Just-In-Time&#xff09;编译是 Java 虚拟机&#xff08;JVM&#xff09;中一种重要的优化技术&#xff0c;用来在程序运行时动态地将字节码编译成机器码&#xff08;也就是平台特定的原生代码&#xff09;&#xff0c;从而提高程序的执行效率。 以下是 JIT 编…

领衔登榜!凯伦股份入选2024年度市级工业设计中心名单

近日&#xff0c;由苏州市工信局认定的2024年度市级工业设计中心名单正式完成了公示&#xff0c;江苏凯伦建材股份有限公司领衔登榜。 据了解&#xff0c;工业设计是指以工业产品为主要对象&#xff0c;综合运用科技手段和工学、美学、心理学、经济学等知识&#xff0c;对产品的…