位置: IT常识 - 正文

React hooks中 useState踩坑-=--异步问题

编辑:rootadmin
React hooks中 useState踩坑-=--异步问题

推荐整理分享React hooks中 useState踩坑-=--异步问题,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

useState作为最常见的一个hook,在使用中总是会出现各种坑,最明显的就是 useState 更新异步的问题。

比如我们把接口返回的数据,使用 useState 储存起来,但是当后面去改变这个数据的时候,每次拿到的都是上次的数据,无法实时更新。

React hooks中 useState踩坑-=--异步问题

或者我们在函数内部使用 setState ,然后立即打印 state,打印的结果还是第一次的state 的值。比如下面的代码实例。

const [data, setData] = useState('111'); const handleTest = () => { console.log(data) // 111 setName('222') console.log(name) // 111 }原因:

useState 返回的更新对象的方法是异步的,要在下次重绘才能获取新值,不要试图在更改状态之后立即获取状态。

1. useState 使用的两种方式

我们知道,useState中的 [ ] 是一个解构运算,第一个是设置的值,第二个是用来改变 state 的方法。

1. 直接传入新值const [data, setData] = useState(1)setData(data + 1)2. 传入回调函数 setState(callback)const [data, setData] = useState(0)setData((prev) => prev + 1); // prev 是data 改变之前的值,return 返回的值会作为新状态覆盖data

一般情况下,我们使用第一种方式即可,但在某些特殊情况下,第一种方式获取到的值不是最新设置的。

2. 解决方案2.1 使用 useRef

思路:先使用 useRef 进行存储数据,再使用 useEffect 监听数据变化,并进行更新。

import React, { useState, useEffect, useRef } from 'react';const Index = () => {const [info, setInfo] = useState()const infoRef = useRef()useEffect(() => {infoRef.current = info}, [info])}

在之后需要使用 info 数据的地方只需要获取 infoRef.current 即可获取最新的 info 数据内容。

2.2 使用回调函数更改数据const [data, setData] = useState({a: 1})setData((prev) => {return {a: prev.a + 1}})
本文链接地址:https://www.jiuchutong.com/zhishi/290733.html 转载请保留说明!

上一篇:瓦尔加迪纳的日落,意大利南蒂罗尔多洛米蒂山脉 (© Marco Capellari/Getty Images)(瓦尔加德)

下一篇:idea的vue文件中使用ElementUi组件(idea打开vue文件)

  • ipad2020参数配置(ipad2)(ipad2020pro参数配置)

  • iqooneo3屏幕多大尺寸(iqooneo3屏幕参数配置)

  • v1818ca是什么手机(v1818c是什么手机)

  • 拼多多红包助力上限(拼多多红包助力软件)

  • siri怎么持续聊天(siri怎么一直聊天)

  • huawei share用途(手机中huawei share什么作用?)

  • 怎么删除标签的分组(怎么删除标签的人)

  • 移动卡收不到所有短信(移动卡收不到电话)

  • 快手如果把对方拉黑,对方能看我作品吗(快手如果把对方拉黑,还能私信对方吗)

  • iphone11拍照发黄解决(iPhone11拍照发黄怎么办)

  • qq神秘字符怎么没了(qq神秘字符fw)

  • 街电充电宝可以异地还吗(街电充电宝可以在别的地方还吗)

  • 文件传送协议FTP的主要工作过程是怎样的(文件传送协议ftp的主要工作过程)

  • 微信输入框字变小(微信输入框字变小,发出去是正常的)

  • 苹果手机怎么设置来电照片(苹果手机怎么设置呼叫转移功能)

  • us sprint是什么版(us t-mobile / sprint (mvno))

  • 微信会显示对方已读吗(微信会显示对方关闭麦克风吗)

  • 开飞行模式短信跑哪了(开飞行模式短信有声音哇)

  • qq语音怎么取消自动翻译(qq语音怎么取消ctrl静音)

  • iphone8自动横屏怎么关(iphone8p横屏)

  • vivox27微信声音怎么换(vivox27微信声音怎么自定义)

  • 华为手机位置信息是干嘛的(华为手机位置信息怎么看)

  • wps怎么查找内容快捷键(wps中怎么查找内容)

  • 制作win7iso镜像文件(制作win7系统镜像文件)

  • cad提取坐标生成表格(cad提取坐标生成表格快捷键)

  • dp线和hdmi线画质区别(dp线比hdmi清晰吗)

  • 开黄钻开错了怎么退款(误开黄钻怎么取消)

  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设 电脑维修 湖南楚通运网络