react hook问题记录(持续更新)

news/2024/7/15 17:14:44 标签: react.js, javascript, 前端

在使用react hook时候的一些问题记录

实际使用react hook的时候遇到的一些问题记录下来了,温故而知新。

问题1:useState已经重新赋值了,但是拿到的还是之前的值

例子1:界面上有个按钮,点击按钮界面上数值会增加1和2

const Test = () => {
   const [arr, setArr] = useState([0]);
   const handleClick = () => {
        Promise.resolve()
        	.then(() => {
        			setArr([...arr, 1)];
        	}
        	.then(() => {
        			setArr([...arr,  2)];
        	}
   }
   return (
   		<div>
   				{arr.toString()}
   				<button onClick={handleClick}>按钮</button>
   		</div>
   )
}

但是实际的结果是:
点击按钮,界面展示的是 0,2。跟预期需要展示的0,1,2不一样

例子2:点击按钮,执行三次setState,希望加3

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

function handleClick() {
	setCount(count + 1);
	setCount(count + 1);
	setCount(count + 1);
}

但是实际的结果是:
点击按钮,界面展示的是1。跟预期需要展示的3不一样

原因
组件内部的任何函数,包括事件处理函数和Effect,都是从它被创建的那次渲染中被看到的,所以引用的值都是旧的(没找到原文出处,所以对“看到”这个词表示疑惑),理解为:因为界面没有重新渲染,执行的函数作用域还是旧的,所以里面值的引用还是之前的,所以即使多次执行,拿到的都是旧值,会导致界面展示出现异常。

直接在handleClick里面打印count,展示的还是上一次的值,不是最新的值,这个由react的调度机制决定的。

修改建议:利用state hook参数可以是回调函数进行解决;或者可以用ref,但是ref记录值不太灵活,所以还是建议回调函数

 setArr([...arr,  2)]; 
 
 --------------变更成-------------
 setArr((arr) => {
 	return [...arr, 2];
 }

http://www.niftyadmin.cn/n/5318947.html

相关文章

jdk、tomcat及mysql的安装和windows项目部署

目录 一、jdk安装 1.1 安装jdk 1.2 配置jdk环境 1.3 配置成功 二、tomcat安装 三、MySQL安装 3.1 解压安装文件夹 3.2改变my.ini文件位置 3.3编辑my.ini文件 3.4 打开cmd 输入 mysqld install 3.5初始化mysql服务端 3.6 sql服务启动mysql 3.7 登录mysql 3.8 修改密…

Ubuntu 20.04 Intel RealSense D435i 相机标定教程

下载编译code_utils mkdir -p ~/imu_catkin_ws/src cd ~/imu_catkin_ws/src catkin_init_workspace source ~/imu_catkin_ws/devel/setup.bash git clone https://github.com/gaowenliang/code_utils.git cd .. catkin_make报错&#xff1a;sumpixel_test.cpp:2:10: fatal err…

Xbox无法登陆解决方式

以下为常见好用的解决XBOX无法登陆的方式 检查网络连接&#xff1a;确保您的网络连接正常&#xff0c;可以尝试访问其他网站或应用程序&#xff0c;以排除网络故障的可能。重启Xbox&#xff1a;尝试按下主机上的关机按钮&#xff0c;等待片刻后再重新开启。有时候&#xff0c;…

QT 文本框的绘制与复选框组键

.cpp文件 #include "widget.h" #include "ui_widget.h"#include<QDebug> Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//更改窗口标题setWindowTitle("我爱xyy");//更改图标setWindow…

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

openssl3.2 - 官方demo学习 - cipher - aesccm.c

文章目录 openssl3.2 - 官方demo学习 - cipher - aesccm.c概述笔记END openssl3.2 - 官方demo学习 - cipher - aesccm.c 概述 aesccm.c 是 AES-192-CCM 的加解密应用例子, 用的EVP接口. 看到不仅仅要用到key, iv, data, 在此之前还要设置 nonce, tag, 认证数据. 为啥需要设置…

八、Stm32学习-USART-中断与接收数据包

1.通信接口 全双工就是数据的收和发可以同时进行&#xff1b;半双工就是数据的收和发不能同时进行。 异步时钟是设备双方需要约定对应的波特率&#xff1b;同步时钟是设备双方有一根时钟线&#xff0c;发送或接收数据是根据这根时钟线来的。 单端电平是需要共GND&#xff1b;…

CTF-PWN-沙箱逃脱-【seccomp和prtcl-1】

文章目录 啥是seccomp#ifndef #define #endif使用使用格式 seccomp无参数条件禁用系统调用有参数条件禁用系统调用 prctl实例 seccomp_export_bpf 啥是seccomp 就是可以禁用掉某些系统调用&#xff0c;然后只能允许某些系统调用 #ifndef #define #endif使用 #ifndef #defin…