React Hooks 的两个坑点
React Hooks 使用注意事项
Area: Hooks
Date: February 10, 2025
Important: 🌟🌟🌟
React Hooks 注意事项
要点:
useState的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染而更新。useEffect可能出现死循环,比如处理请求接口时,依赖项绑定对象类型数据,会死循环。
useState 的初始值问题
Case:useState 的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染时更新。
理解:useState 的初始化值只在组件的第一次渲染时生效,不会随着 props 或 state 的变化而更新。

import React, { useState } from 'react'// 子组件
function Child({ userInfo }) {// render: 初始化 state// re-render: 只恢复初始化的 state 值,不会再重新设置新的值// 只能用 setName 修改const [name, setName] = useState(userInfo.name)return (<div><p>Child, props name: {userInfo.name}</p><p>Child, state name: {name}</p></div>)
}function App() {const [name, setName] = useState('双越')const userInfo = { name }return (<div><div>Parent <button onClick={() => setName('慕课网')}>setName</button></div><Child userInfo={userInfo} /></div>)
}export default App
解决方案:使用 useEffect 来监听 userInfo 的变化,并在变化时更新 name。
import React, { useState, useEffect } from 'react'function Child({ userInfo }) {const [name, setName] = useState(userInfo.name)// 使用 useEffect 来监听 userInfo.name 的变化并更新 nameuseEffect(() => {setName(userInfo.name)}, [userInfo.name]) // 当 userInfo.name 发生变化时更新 namereturn (<div><h1>Child, Props name: {userInfo.name}</h1><h1>Child, state name: {name}</h1></div>)
}function App() {const [name, setName] = useState('Nathan')const userInfo = {name,}return (<div><h1>UserName</h1><button onClick={() => setName('XXXX')}>Change Name</button><Child userInfo={userInfo} /></div>)
}export default App
useEffect 的死循环问题
Case:useEffect 死循环
理解:处理请求接口时,依赖项绑定对象类型数据,会死循环。

import { useState, useEffect } from 'react'
import axios from 'axios'// 传入 config,类型为对象
function useAxios(url, config = {}) {const [loading, setLoading] = useState(false)const [data, setData] = useState()const [error, setError] = useState()useEffect(() => {setLoading(true)axios.get(url) // 发送一个 get 请求.then(res => setData(res)).catch(err => setError(err)).finally(() => setLoading(false))}, [url, config])return [loading, data, error]
}export default useAxios
分析:
1-useEffect 和依赖项的关系:
在 useEffect 中,[url, config] 是依赖项数组。这意味着当 url 或 config 发生变化时,useEffect 会重新执行。
2-对象 config 的变化:
在 JavaScript 中,对象(如 config)是引用类型。如果每次重新渲染时,config 的引用发生了变化,即使它的内容相同,React 也会认为它发生了变化,从而触发 useEffect 的重新执行。
这就导致了一个问题:每次组件重新渲染时,config 对象的引用可能会发生变化,即使它的值没有改变。这会导致 useEffect 被反复调用,进而每次发起请求。
注:这里 React 底层使用的是 Object.is() 进行比较

总结无限请求的原因:
- 每次组件渲染时,
config会被认为是新的对象(即使它的内容没有变化),从而触发useEffect重新执行。 useEffect执行时会发起请求,且请求可能会导致config的变化(如果在请求完成后更新了config,即使没有显式更新也可能影响父组件中的config)。- 因此,
useEffect会再次被触发,导致请求不断发起,形成无限请求的循环。
解决方案:
基础方案:
useEffect 依赖项不要放置对象类型。可在之前将对象解构,useEffect依赖项中放置基本类型值
另一种方案:
如果你希望在 config 变化时也重新发送请求,你可以使用 useMemo 来确保只有在 config 内容变化时才触发请求:
import { useState, useEffect, useMemo } from 'react'
import axios from 'axios'function useAxios(url, config = {}) {const [loading, setLoading] = useState(false)const [data, setData] = useState()const [error, setError] = useState()// 使用 useMemo 来确保 config 引用只有在实际变化时才会更新const memoizedConfig = useMemo(() => config, [JSON.stringify(config)])useEffect(() => {setLoading(true)axios.get(url, memoizedConfig) // 使用 memoizedConfig 而非原始 config.then(res => setData(res)).catch(err => setError(err)).finally(() => setLoading(false))}, [url, memoizedConfig])return [loading, data, error]
}export default useAxios相关文章:
React Hooks 的两个坑点
React Hooks 使用注意事项 Area: Hooks Date: February 10, 2025 Important: 🌟🌟🌟 React Hooks 注意事项 要点: useState 的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染而更新。useEffect 可…...
C语言的字符串偏移小记
通过C的指针,我们可以遍历一个很长的字符串。我们针对这个字符串可以按照字符串里面的终止符做切分。 首先我们来看下面的一段代码: #include <stdio.h> #include <stdlib.h> #include <stdio.h> #include <string.h>const ch…...
Python学习心得正则表达式及re模块的使用
一、正则表达式定义以及正则表达式的构成: 1.什么式正则表达式: 正则表达式:是一个比较特殊的字符序列,能够帮助用户检查一个字符串是否符合某种特殊的模式。 2.正则表达式的构成: 正则表达式是由元字符和限定字符…...
Oracle启动与关闭(基础操作)
11g读取参数文件的顺序 9i之前,只有静态参数文件pfile文件。 9i开始,引入了动态参数文件spfile文件。 Windows: %ORACLE_HOME%\database SPFILEORCL就是动态参数文件 Linux: $ORACLE_HOME/dbs 11g中,启动数据库。…...
第二月:学习 NumPy、Pandas 和 Matplotlib 是数据分析和科学计算的基础
以下是一个为期 **1 个月(30 天)**的详细学习计划,精确到每天的学习内容和练习作业,帮助你系统地掌握 NumPy、Pandas 和 Matplotlib 的核心功能。 第 1 周:NumPy 基础 Day 1:NumPy 简介与数组创建 学习内…...
AI 语言模型发展史:统计方法、RNN 与 Transformer 的技术演进
引言 自然语言处理(NLP)是 AI 领域的重要分支,而语言模型(Language Model, LM)是 NLP 的核心技术。语言模型经历了从 统计方法 到 RNN(循环神经网络),再到 Transformer 的演进&…...
新版电脑通过wepe安装系统
官方下载链接 WIN10下载 WIN11下载 微PE 启动盘制作 1:选择启动盘的设备 2:选择对应的U盘设备,点击安装就可以,建议大于8g 3:在上方链接下载需要安装的程序包,放入启动盘,按需 更新系统 …...
Jmeter断言、关联、录制脚本
Jmeter断言 断言:让程序自动判断预期结果和实际结果是否一致 提示: Jmeter在请求的返回层面有个自动判断机制(响应状态码 2xx:成功,4xx/5xx:失败)但是请求成功了,并不代表结果一定正确,因此需要检测机制提…...
29、深度学习-自学之路-深入理解-NLP自然语言处理-做一个完形填空,让机器学习更多的内容程序展示
import sys,random,math from collections import Counter import numpy as npnp.random.seed(1) random.seed(1) f open(reviews.txt) raw_reviews f.readlines() f.close()tokens list(map(lambda x:(x.split(" ")),raw_reviews))#wordcnt Counter() 这行代码的…...
SpringBoot速成(12)文章分类P15-P20
1.新增文章分类 1.Postman登录不上,可以从头registe->login一个新的成员:注意,跳转多个url时,post/get/patch记得修改成controller类中对应方法上写的 2.postman运行成功: 但表中不更新:细节有问题: c是…...
RedHat8安装postgresql15和 postgis3.4.4记录及遇到的问题总结
安装包对照版本参考 UsersWikiPostgreSQLPostGIS – PostGIS 如果Red Hat系统上有旧版本的PostgreSQL需要卸载 在较新的Red Hat版本,使用dnf包管理器卸载:sudo dnf remove postgresql-server postgresql 旧版本,使用yum包管理器卸载 sudo y…...
深入解析计算机网络请求头:常见类型与安全性影响
目录 1. Host 2. User-Agent 3. Cookie 4. Referer(或 Referrer) 5. Authorization 6. Content-Type 7. Content-Length 8. Origin 9. X-Forwarded-For (XFF) 10. Upgrade-Insecure-Requests 11. X-Frame-Options 12. Cache-Control 13. Ac…...
VisoMaster整合包及汉化
VisoMaster是个图片及视频换脸工具,速度快,性能十分强大。 VisoMaster安装有2种方式,根据官网指引安装也十分简单,在此就不重复,只说说安装过程中要注意的事项: 1、自动安装:需要在网络十分畅…...
从安装软件到flask框架搭建可视化大屏(二)——创建一个flask页面,搭建可视化大屏,零基础也可以学会
附录:所有文件的完整代码 models.py # models/models.py from flask_sqlalchemy import SQLAlchemydb SQLAlchemy()class User(db.Model):__tablename__ user # 显式指定表名为 userid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(…...
【mybatis】基本操作:详解Spring通过注解和XML的方式来操作mybatis
mybatis 的常用配置 配置数据库连接 #驱动类名称 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver #数据库连接的url spring.datasource.urljdbc:mysql://127.0.0.1:3306/mybatis_test characterEncodingutf8&useSSLfalse #连接数据库的名 spring.datasourc…...
[JVM篇]垃圾回收器
垃圾回收器 Serial Seral Old PartNew CMS(Concurrent Mark Sweep) Parallel Scavenge Parallel Old G1 ZGC...
DeepSeek专题:DeepSeek-V1核心知识点速览
AIGCmagic社区知识星球是国内首个以AIGC全栈技术与商业变现为主线的学习交流平台,涉及AI绘画、AI视频、大模型、AI多模态、数字人以及全行业AIGC赋能等100应用方向。星球内部包含海量学习资源、专业问答、前沿资讯、内推招聘、AI课程、AIGC模型、AIGC数据集和源码等…...
Ubuntu24.04更新国内源
24.04 源文件地址 已经更换为 /etc/apt/sources.list.d/ubuntu.sources sudo vim /etc/apt/sources.list.d/ubuntu.sources把内容替换为 # 阿里云 Types: deb URIs: http://mirrors.aliyun.com/ubuntu/ Suites: noble noble-updates noble-security Components: main restric…...
是时候说再见了
说再见 2018 to 2025 2018:学习 2018年开始读研。师兄师姐们说可以写写CSDN博客,对找工作也有帮助。于是在12月4日,发布了自己的第一篇文章[翻译] 神经网络与深度学习 首页 - Index。当时还在学习各种基础知识,看到了这个英文文…...
SpringBoot+shardingsphere实现按月分表功能
SpringBootshardingsphere实现按月分表功能 文章目录 前言 ShardingSphere 是一套开源的分布式数据库中间件解决方案,旨在简化数据库分片、读写分离、分布式事务等复杂场景的管理。它由 Apache 软件基金会支持,广泛应用于需要处理大规模数据的系统中 一…...
表情识别任务的复现 for 毕设
前言 为了带师弟做毕设,我们复现了表情识别任务。该文章仅用于记录 首先,感谢复现过程中所参考的分享: 【Bilibili】基于卷积神经网络实现的面部表情识别(pytorch)【Github】 facial-expression-recognition【Blog】…...
教程 | 从零部署到业务融合:DeepSeek R1 私有化部署实战指南
文章目录 1. 什么是 DeepSeek R1?a. 主要介绍a. 版本区别 2. 部署资源要求a. 硬件资源要求 3. 本地安装DeepSeek-R1a. 为什么选择本地部署?b. 部署工具对比c. 演示环境配置d. Ollama安装流程 4. 可视化工具a. 工具对比b. Open-WebUI部署 5. AI API应用a.…...
分布式 NewSQL 数据库(TiDB)
TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。 TiDB是 PingCAP公司自主设计、研发的开源分布式关系型数据…...
密码管理 - 使用BitWarden/VaultWarden自托管密码服务 - 折腾记录
密码管理 - 使用Bitwarden/Vaultwarden自托管密码服务 - 折腾记录 前言 某天(大约两周前了至少 一直没找到机会记录)逛Github发现了开源的密码管理服务Bitwarden,能自托管、能加密、多端适配。 这,,不是让人如获至宝吗。于是就开始折腾了。…...
C语言-章节 1:变量与数据类型 ——「未初始化的诅咒」
在那神秘且广袤无垠的「比特大陆」上,阳光奋力地穿过「内存森林」中错综复杂的代码枝叶缝隙,洒下一片片斑驳陆离、如梦似幻的光影。林间的空气里,弥漫着一股浓郁的十六进制锈蚀味,仿佛在诉说着这片森林中隐藏的古老秘密。 一位零基…...
机器视觉--Halcon If语句
引言 在机器视觉领域,Halcon 是一款功能强大且广泛应用的软件。在使用 Halcon 进行编程时,条件判断是不可或缺的一部分,而IF语句就是实现条件判断的核心工具之一。通过IF语句,我们能够根据不同的条件执行不同的代码块,…...
Linux基础之文件权限的八进制表示法
1. Linux 文件权限概述 在 Linux 中,每个文件或目录都有三种基本权限,分别是: 读权限 - r:允许查看文件内容。写权限 - w:允许修改文件内容。执行权限 - x:允许执行文件或进入目录。 每个文件或目录的权…...
HTML的入门
一、HTML HTML(HyperText Markup Language,超文本标记语言)是一种用来告知浏览器如何组织页面的标记语言。 超文本:就是超越了文本;HTML不仅仅可以用来显示文本(字符串、数字之类),还可以显示视频、音频等…...
Vue2/Vue3生命周期对比
Vue2的生命周期钩子 beforeCreate 在实例初始化之后,数据观测(data)和事件配置之前调用。此时无法访问 data、methods 等。 created 在实例创建完成后调用。此时可以访问 data、methods,但 DOM 还未生成。 beforeMount 在挂载…...
闭源大语言模型的怎么增强:提示工程 检索增强生成 智能体
闭源大语言模型的怎么增强 提示工程 检索增强生成 智能体 核心原理 提示工程:通过设计和优化提示词,引导大语言模型进行上下文学习和分解式思考,激发模型自身的思维和推理能力,使模型更好地理解和生成文本,增强其泛用性和解决问题的能力。检索增强生成:结合检索的准确…...
