React Hooks 那些事儿

翻了波之前写的文章还有笔记,发现关于前端的文章并不多(好歹也划水做过点前端开发)。巧了,最近没什么好话题可写,做下 React Hooks 学习笔记吧。

Effect Hook

不得不说 Hook 的出现降低了我们在 React 中处理副作用(side effect)的心智负担,通过 useEffect 就可以很好的完成之前需要使用几个生命周期函数配合才能完成的事。

Effect Hook 死循环请求问题

由于 Effect Hook 不熟「官方文档没读透」,最近使用 useEffect 出现了异步请求发送了无限次的问题,翻🚗了。我有个组件大概是这么写的:

import React, { useState, useEffect } from 'react';import request from 'umi-request';import logo from './logo.svg';
import './App.css';function App() {const [data, setData] = useState([]);useEffect(() => {request('https://jsonplaceholder.typicode.com/todos/', {method: 'get',}).then(response => {console.log('fetch data');setData(response);}).catch(error => {console.log("report error: ", error);})});return (<div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><ul>{data.map(item => {return (<li key={item.id}>{item.title}</li>);})}</ul></header></div>);
}export default App;

效果如下:

{% iframe https://codesandbox.io/embed/nice-sea-zo2c2?fontsize=14&hidenavigation=1&theme=dark 100% 500 %}

{% gallery %} 效果 {% endgallery %}

https://zo2c2.csb.app/,可以很方便的从调试控制台看到,异步请求一直在发,陷入了死循环之中。这是为什么?因为 useEffect 会在组件 Mounting 和 Updating 阶段执行。每次 request 请求成功,我们都会设置一次组件的 state -> data,所以组件会更新,useEffect 会再次执行,循环往复,造成了无限重复请求问题。那么,如何解决这个问题?之前我忽略了 useEffect 第二个参数的存在,使用 useEffect 的第二个参数可以解决这个问题。一般情况下,我们希望组件只在 mounting 阶段异步获取数据,所以,我们可以这么设置 useEffect 的第二个参数,让它具有和 componentDidMount 生命周期函数类似的行为(组件第一次 mount 后执行):

{% folding red open, React 组件生命周期 %}

lifecycle

来源:https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/

{% endfolding %}

{% codeblock lang:jsx line_number:true mark:7,12 %} useEffect(() => { request('https://jsonplaceholder.typicode.com/todos/', { method: 'get', }) .then(response => { console.log('fetch data'); setData(response); }) .catch(error => { console.log("report error: ", error); }) }, []); {% endcodeblock %}

我们传递了一个空数组作为 useEffect 的第二个参数,这样就能避免在组件 Updating 阶段执行 useEffect。这个数组成为依赖数组。依赖数组为空,表明 useEffect 不会因为某个变量的变化而再次执行。在组件需要根据某个变量变化进行渲染的时候,可以将此变量放到依赖数组中,一旦这个依赖的变量变动,useEffect 就会重新执行。

让组件卸载后做点事

在 class 组件中,我们可以将组件卸载后要做的事放在 componentWillUnmount 中。引入 Hook 后,在 function 组件中,我们可以把组件卸载要做的事放在 useEffect 中,让它返回一个 callback 即可,如下:

import React, { useState, useEffect } from "react";function Child({ visible }) {useEffect(() => {alert("组件已挂载");return () => {  // return 一个 callbackalert("组件已被卸载!!");};}, []);return visible ? "true" : "false";
}export default function App() {const [visible, changeVisible] = useState(true);return (<div>{visible && <Child visible={visible} />}<buttononClick={() => {changeVisible(!visible);}}>{visible ? "卸载组件" : "挂载组件"}</button></div>);
}

{% iframe https://codesandbox.io/embed/condescending-minsky-jnzcc?fontsize=14&hidenavigation=1&theme=dark 100% 500 %}

{% gallery %} effect 卸载组件做点事儿 {% endgallery %}

参考

  • 精读 useEffect 完全指南
  • useEffect 完整指南
  • useEffect 使用指南
  • How to fetch data with React Hooks?
  • 看完这篇,你也能把 React Hooks 玩出花

    本文由博客群发一文多发等运营工具平台 OpenWrite 发布

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VB+ACCESS学籍管理系统-264-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword264 设计要求&#xff1a; 第一&#xff1a;一篇论文&#xff08;5000到10000字&#xff09;不包括图表和程序代码。A4纸20页之内。 论文结构如下&#xff1a; 设计题目&#xff1a;学籍管理系统 附&#xff1a;程…

LDK加密狗的多种功能特点

LDK加密狗是一种在软件保护领域广泛应用的硬件加密设备&#xff0c;它为软件提供了强有力的版权保护&#xff0c;确保软件开发商的权益得到充分保障。本文将从LDK加密狗的工作原理、功能特点、应用场景以及未来发展等方面进行详细阐述。 LDK加密狗的工作原理基于硬件加密技术。…

零知识玩转AVH(5)—— 怎么玩(4)

接前一篇文章&#xff1a;零知识玩转AVH&#xff08;4&#xff09;—— 怎么玩&#xff08;3&#xff09; 上一回经过了一个艰苦的探索过程&#xff0c;最终完成了“arm-avh-best-practice-project-product-subscription-guide-cn.pdf”即“Arm虚拟硬件实践专题一&#xff1a;产…

【绩效管理】某连锁购物中心绩效考核体系搭建咨询项目

随着企业规模的扩大&#xff0c;员工数量不断增加&#xff0c;与之相关的人事管理工作的复杂性也随之增大。但是由于行业的特点&#xff0c;该购物中心的人员整体素质偏低&#xff0c;且自成立以来&#xff0c;该中心重经营轻管理&#xff0c;其人力资源管理水平也有待提升。在…

第二证券|炒股最好用的6个指标?

炒股存在以下好用的6个目标&#xff1a; 1、kdj目标 当k线从下方往上穿过d线时&#xff0c;构成金叉&#xff0c;是一种买入信号&#xff0c;投资者能够考虑在此刻买入一些个股&#xff0c;其间kdj金叉方位越低&#xff0c;买入信号越强&#xff1b;当k线从上往下穿过d线时&a…

【Java并发知识总结 | 第四篇】Java线程池详讲

文章目录 4.Java线程池详讲4.1线程池介绍4.1.1什么是线程池4.1.2线程池的作用4.1.3没有线程池的线程执行任务模型 4.2JAVA线程池4.2.1Executor框架介绍4.2.2Executor框架的组成&#xff08;1&#xff09;任务&#xff08;Runnable/Callable&#xff09;&#xff08;2&#xff0…

视频格式怎么批量转换?5 个批量视频转换器分享

可以同时转换多个视频吗&#xff1f;您是否正在寻找一款有用的批量视频转换器&#xff1f;最好的批量视频转换器是什么&#xff1f; 使用批量视频转换器同时转换多个视频文件是一个好方法。这篇文章为您总结了 5 个最好的批量视频转换器。 5 个批量视频转换器分享 1、奇客视频…

不用ChatGPT会扣分!韩国大学大胆拥抱生成式AI

“请尝试使用人工智能(AI)进行创作”。 这是韩国成均馆大学影像系教授李慧旼(音)在上学期的课堂中给学生们留的作业。她希望学生们能利用生成型绘图AI软件Dall-E或Midjourney来创作作品。学生们利用AI创作的作品非常有趣&#xff0c;一名学生用文字描述了喜欢用的香水后&#x…

【相关问题解答1】bert中文文本摘要代码:import时无法找到包时,几个潜在的原因和解决方法

【相关问题解答1】bert中文文本摘要代码 写在最前面问题1问题描述一些建议import时无法找到包时&#xff0c;几个潜在的原因和解决方法1. 模块或包的命名冲突解决方法&#xff1a; 2. 错误的导入路径解决方法&#xff1a; 3. 第三方库的使用错误解决方法&#xff1a; 4. 包未正…

【C++教程从0到1入门编程】第八篇:STL中string类的模拟实现

一、 string类的模拟实现 下面是一个列子 #include <iostream> namespace y {class string{public: //string() //无参构造函数// :_str(nullptr)//{}//string(char* str) //有参构造函数// :_str(str)//{}string():_str(new char[1]){_str[0] \0;}string(c…

wordpress博客趣主题个人静态网页模板

博客趣页面模板适合个人博客&#xff0c;个人模板等内容分享。喜欢的可以下载套用自己熟悉的开源程序建站。 博客趣主题具有最小和清洁的设计&#xff0c;易于使用&#xff0c;并具有有趣的功能。bokequ主题简约干净的设计、在明暗风格之间进行现场切换。 下载地址 清新个人…

上海亚商投顾:沪指缩量调整 传媒、游戏股逆势大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日震荡调整&#xff0c;上证50指数跌近1%&#xff0c;保险等权重板块走低&#xff0c;中国太保跌超…