react函数组件useState异步,数据不能及时获取到

本文探讨了在React中useState函数的异步特性,如何可能导致state只在最后更新的问题,并提供了使用回调方式解决此问题的方法。作者强调了在循环中谨慎使用useState的重要性,并给出了代码示例以展示正确实践。
摘要由CSDN通过智能技术生成

useState() 属于异步函数,在useState() 第一次存储的时候,值会存储不上
因为react中state的更新是异步的,我们setState后,react不会立刻对值进行改变,而是将其暂时放入pedding队列中。react会合并多个state,然后值render一次,所以不要在循环中使用useState,它有可能只render最后一次set值,但是当传入一个函数时,函数就会被放入一个队列中,然后按照顺序执行。

问题

const Dva = () => {
    const [arr, setArr] = useState([0])

    // 两个回调函数,第一个回调函数完成后,会将返回结果作为参数,传入第二个参数
    const handleClick = () => {
        Promise.resolve().then(() => {
            setArr([...arr, 1]);
        })
            .then(() => {
                setArr([...arr, 2]);
            })
    }
    useEffect(() => {
        console.log(arr)
    }, [arr]);

    return (
        <>
            <div>
                <button onClick={handleClick}>change</button>
            </div>
        </>
    )
}

输出:
在这里插入图片描述

解决方法一

  • 使用回调方式传参
  const handleClick = () => {
        Promise.resolve().then(() => {
            setArr([...arr, 1]);
        }).then(() => {
            setArr(preStae => [...preStae, 2])
        })
    }

    useEffect(() => {
        console.log(arr)
    }, [arr]);

输出:
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值