react中useState的值没有改变,而是旧的数值

ops/2024/11/14 12:46:16/

问题背景

想实现点击按钮就改变数据的效果,但是在控制台的打印结果,总是上一次的修改情况,并不是最新的修改后的数据
在这里插入图片描述
代码:

import { useState, useRef } from "react";// 实现sonA的数据传递给sonB
const SonA = () => {const [sonAName, setAName] = useState("");const sonARef = useRef(null);const changeAName = () => {console.log("sonARef.current.value", sonARef.current.value);setAName(sonARef.current.value);console.log("sonAName:", sonAName);};return (<div><input type="text" ref={sonARef} /><button onClick={changeAName}>changeAName</button></div>);
};const SonB = () => {return <div>SOnB</div>;
};const App = () => {return (<div><SonA> </SonA><SonB></SonB></div>);
};export default App;

原理解释:

在 React 中,useState 是一个异步更新状态的 Hook,因此在调用 setAName 更新状态后,sonAName 并不会立即改变,而是会在下一次渲染时才会更新。

因此,在 console.log("sonAName:", sonAName); 这行代码中,你看到的仍然是更新前的 sonAName 的值。

如果你想在状态更新后立即获取最新的状态值,可以考虑使用 useEffect 来监听状态的变化,然后在回调函数中执行相应的逻辑。

你可以这样修改 SonA 组件:

javascript">import React, { useState, useRef, useEffect } from "react";const SonA = () => {const [sonAName, setAName] = useState("");const sonARef = useRef(null);useEffect(() => {console.log("sonAName:", sonAName);}, [sonAName]);const changeAName = () => {console.log("sonARef.current.value", sonARef.current.value);setAName(sonARef.current.value);};return (<div><input type="text" ref={sonARef} /><button onClick={changeAName}>changeAName</button></div>);
};const SonB = () => {return <div>SOnB</div>;
};const App = () => {return (<div><SonA /><SonB /></div>);
};export default App;

这样,在 sonAName 发生变化时,useEffect 就会被触发,你就能够在控制台中看到最新的 sonAName 值了。

页面渲染的数据正常??

在这里插入图片描述在这里插入图片描述

虽然打印出来的数据总是显示上一次的数据,但是在页面显示的时候是实时更新的,没有延后的问题

原理解释:

这是因为 useState 的更新是异步的,setAName 不会立即改变 sonAName 的值。在 React 中,状态更新是批量处理的,所以在调用 setAName 后,React 并不会立即更新 sonAName 的值。

而在 React 中,组件重新渲染时会获取到最新的状态值,因此当 sonAName 的值在组件重新渲染时已经更新时,页面中显示的 {sonAName} 是最新的值。

而在 changeAName 函数中的 console.log("sonAName:", sonAName); 这行代码中,你看到的是更新前的 sonAName 值,因为 setAName 的更新并没有立即改变 sonAName 的值,而是在下一次渲染时才生效。

如果你想要在状态更新后立即获取最新的状态值,可以考虑使用 useEffect 来监听状态的变化,然后在回调函数中执行相应的逻辑。这样可以确保在状态更新后获取到最新的值。


http://www.ppmy.cn/ops/6864.html

相关文章

途游游戏,科锐国际(计算机类),得物,蓝禾,奇安信,顺丰,康冠科技,金证科技24春招内推

途游游戏&#xff0c;科锐国际&#xff08;计算机类&#xff09;&#xff0c;得物&#xff0c;蓝禾&#xff0c;奇安信&#xff0c;顺丰&#xff0c;康冠科技&#xff0c;金证科技24春招内推 ①得物 【岗位】技术&#xff0c;设计&#xff0c;供应链&#xff0c;风控&#xff0…

【docker】把镜像save出来

先把要commit的容器停止。 为了确保提交的镜像反映容器某一精确时刻的稳定状态&#xff0c;应在提交Docker容器为新镜像前先停止该容器。这样生成的新镜像将更可靠、易于管理和重现。 sudo docker commit 容器名 镜像名&#xff1a;tag sudo docker commit sjtu sjtu:4.17 …

微信小程序配置了onShareTimeline分享到朋友圈,但是在开发者工具中这里始终是灰色的,在真机调试的时候也没有发现有分享到朋友圈的相关信息。

微信小程序配置了onShareTimeline分享到朋友圈&#xff0c;但是在开发者工具中这里始终是灰色的&#xff0c;在真机调试的时候也没有发现有分享到朋友圈的相关信息。 有说&#xff1a;使用 web-view组件的页面支持分享发送给朋友不支持分享到朋友圈 折腾半天不如看官方文档。 …

【微服务】Hystrix的概念、作用以及使用方法

目录 概念 作用 使用方法 Hystrix的实现 Hystrix 是 Netflix 提供的一个用于分布式系统的延迟和容错库。它旨在通过在客户端库中实现断路器模式&#xff0c;从而防止在一个分布式环境中的雪崩效应并提供回退选项&#xff0c;从而增强了分布式系统的弹性和可靠性。 概念 断…

HAL STM32 SSI/SPI方式读取MT6701磁编码器获取角度例程

HAL STM32 SSI/SPI方式读取MT6701磁编码器获取角度例程 &#x1f4cd;相关篇《HAL STM32 I2C方式读取MT6701磁编码器获取角度例程》&#x1f4cc;当前最新MT6701数据手册&#xff1a;https://www.magntek.com.cn/upload/MT6701_Rev.1.8.pdf&#x1f4dc;SSI协议读角度&#xff…

linux设备树-of_parse_phandle_with_args

1.设备树实例 interrupt-controller1 { compatible "vendor,gic"; #interrupt-cells <2>; interrupt-controller; reg <0x01 0x1000>; }; deviceA { compatible "vendor,device-a"; reg <0x02 0x100>; interrupts <&interr…

物联网与服务器有什么样的联系?

当今物联网是比较火的词汇&#xff0c;那么物联网是什么呢&#xff1f;物联网对人们的生活会产生哪些影响呢&#xff1f;。说的通俗一点物联网就是将设 备接入网络&#xff0c;实现设备智能化。那么物联网与服务器又有着怎样的联系呢&#xff1f;下面我们就一起来探讨一下这个问…

MySql运维篇

目录 一.日志 1.1日志分类 1.2Error Log 1.3BinaryLog 1.4SlowQuery Log 二.备份 2.1备份原因 2.2备份目标 2.3备份技术 2.3.1物理备份 2.3.2逻辑备份 2.4备份方式 2.4.1完全备份 2.4.2增量备份 2.4.3差异备份 2.5备份环境准备 2.6完全备份实验 2.6.1完全备…