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

React@16.x(23)useEffect

目录

  • 1,介绍
    • 作用
    • 介绍
  • 2,注意点
    • 2.1,参数1,副作用函数
      • 2.1.1,运行时间点
      • 2.1.2,返回值
      • 2.1.3,闭包的影响
      • 2.1.4,严禁出现在代码块中(判断,循环)
      • 2.1.5,尽量保持副作用函数稳定
    • 2.2,参数2,数组

1,介绍

作用

用于在函数组件内,处理副作用,比如:

  • ajax 请求
  • 计时器
  • 其他异步操作
  • 更改真实DOM对象
  • 本地存储
  • 其他会对外部产生影响的操作(和自身无关)。

介绍

useEffect 接收2个参数,

  • 参数1,一个函数。在该函数中执行副作用。
  • 参数2(可选),一个数组。记录参数1中使用到的依赖。
import React, { useEffect, useState } from "react";export default function App() {const [n, setN] = useState(0);useEffect(() => {document.title = `数字:${n}`;});return (<div><span>{n}</span><buttononClick={() => {setN(n + 1);}}>加一</button></div>);
}

2,注意点

2.1,参数1,副作用函数

2.1.1,运行时间点

在页面完成真实UI渲染后执行,并且是异步的,不会阻塞浏览器。

和类组件中的生命周期函数 componentDidMountcomponentDidUpdate区别

它们是同步执行的;在得到真实DOM后,用户还没有看到真实UI渲染时执行。

2.1.2,返回值

要么没有返回值,如果有必须是一个函数。该函数称为清理函数

type EffectCallback = () => void | (() => void);;

清理函数的特点:

  • 首次渲染不会执行,组件销毁一定执行;
  • 再次渲染时,会在副作用函数之前运行。

所以,一般会在清理函数中,清理副作用函数开启的计时器。

import React, { useEffect, useState } from "react";function Child() {useEffect(() => {let timer = null;let n = 10;timer = setInterval(() => {console.log(n--);}, 1000);return () => {clearInterval(timer);};});return <div>子组件</div>;
}export default function App() {const [visible, setVisible] = useState(true);return (<div>{visible && <Child />}<buttononClick={() => {setVisible(!visible);}}>显示/隐藏</button></div>);
}

2.1.3,闭包的影响

在副作用函数中,如果使用了函数组件上下文中的变量,受闭包影响,会导致副作用函数中的变量不会实时变化

原理和闭包的经典问题一样,不同点是这里的 n 是一个状态

也就是说,每次函数组件重新调用,计时器的回调函数使用的都是当次函数组件调用时产生的新值( 相当于计时器中使用了传递的参数)。

所以每次开启新计时器时,n 都不一样。

export default function App() {const [n, setN] = useState(10);useEffect(() => {setTimeout(() => {console.log(n);}, 3000);});return (<div><buttononClick={() => {setN(n - 1);}}>n-1</button></div>);
}

3s 后打印,所以在3s内连续点击按钮3次,3s后会先打印出 10(首次渲染),再依次打印出 9 8 7

2.1.4,严禁出现在代码块中(判断,循环)

原理和 useState 类似,这样写会导致无法正确获取要执行的副作用函数。

2.1.5,尽量保持副作用函数稳定

副作用函数在每次(重新渲染)注册时,会覆盖掉之前的副作用函数,因此,尽量保持副作用函数稳定,否则控制起来会比较复杂。

2.2,参数2,数组

作用:记录副作用函数的依赖数据。当组件重新渲染后,如果新旧依赖数据不一致(Object.is() 判断),才会执行副作用函数。

类似于 Vue3 中的 watcheffect。

所以,如果依赖数据没有发生变化,则:

  • 副作用函数仅在组件第一次渲染后执行;
  • 清理函数仅在组件卸载时执行。

参数2传递空数组就能实现依赖不发生变化。

useEffect(() => {console.log('副作用函数执行');return () => {console.log('清理函数执行');}
}, [])

比如请求列表数据,当前页码 page 和每页展示个数 limit 发生变化时,再请求接口:

useEffect(() => {(async function () {const resp = await getList(page, limit);// 获取 list 和 total})();
}, [page, limit])

以上。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [ue5]建模场景学习笔记(5)——必修内容可交互的地形,交互沙(3)
  • Spring Boot 深度学习笔记:从入门到精通的全面指南
  • 【报文数据流中的反压处理】
  • CleanMyMac2024最新免费电脑Mac系统优化工具
  • SQL Server中的CTE和临时表优化
  • C语言 | Leetcode C语言题解之第140题单词拆分II
  • CMakeLists如何多行注释
  • 计算机毕业设计python+spark知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习
  • RoLabelImg下载及旋转目标检测数据标注
  • Linux | buildrootfs 添加mkfs.ext3/mkfs.ext4 支持
  • 【算法小记】深度学习——时间序列数据分析 Time series Data Analysis
  • C#操作MySQL从入门到精通(17)——使用联结
  • Android AOSP定制去掉Google搜索栏
  • 单词记忆(第二周)
  • 如何提高工作效率?
  • 【Linux系统编程】快速查找errno错误码信息
  • Android框架之Volley
  • create-react-app做的留言板
  • ES2017异步函数现已正式可用
  • Python实现BT种子转化为磁力链接【实战】
  • QQ浏览器x5内核的兼容性问题
  • 精彩代码 vue.js
  • 开源SQL-on-Hadoop系统一览
  • 跨域
  • 蓝海存储开关机注意事项总结
  • 深入浅出Node.js
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • #07【面试问题整理】嵌入式软件工程师
  • #565. 查找之大编号
  • #include
  • (2.2w字)前端单元测试之Jest详解篇
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (ZT)一个美国文科博士的YardLife
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (三) diretfbrc详解
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (转)iOS字体
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 反射的使用
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net的DataSet直接与SQL2005交互
  • 。Net下Windows服务程序开发疑惑
  • :O)修改linux硬件时间
  • @PostConstruct 注解的方法用于资源的初始化
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [145] 二叉树的后序遍历 js
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [Android]竖直滑动选择器WheelView的实现
  • [C++] vector list 等容器的迭代器失效问题