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

在使用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];
 }
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值