useState的基本使用

本文深入探讨了React函数式组件中Hooks的使用,特别是useState钩子如何处理状态更新。通过示例说明了setXXX的异步更新性质,状态复用策略以及如何通过函数参数确保状态更新的正确性。同时,提到了内部的浅比较优化,强调了只有传入新对象才会触发页面更新。最后,给出了最佳实践,包括推荐使用函数参数更新状态以避免状态丢失问题。
摘要由CSDN通过智能技术生成

react 函数式组件为了能够保存状态引入了hooks。
useState不能直接修改返回值,执行setXXX会让整个函数组件从头执行生成新的上下文,所以需要配合useMemo,useCallback等api使用。
setXXX修改步骤:

  1. 将传入setxxx后续操作,放到fiber节点的hooks链对应的hook节点的任务队列;
  2. 重新执行组件函数,基于原hook链按顺序生成新的hook链并给被hooks包裹的变量赋值,执行到有操作的setxxx hook节点,执行操作后再赋值;
  3. 基于当前上下文重新渲染函数组件;

1. setxxx 异步更新

在这里插入图片描述

2. setxxx 状态复用

  • 传参变量(以最后一次赋值为准)

    const [count, setCount] = useState(0);
    
    function handleCount() {
        setCount(count + 2);
        setCount(count + 1);
    }
    // 页面最终展示 1
    
  • 传参函数(对状态进行复用)

    const [count, setCount] = useState(0);
    
    function handleCount() {
        setCount(pre => pre + 2);
        setCount(pre => pre + 1);
    }
    // 页面最终展示 3
    

3. 内部浅拷贝优化

	const [count, setCount] = useState(["a", "b"]);
	function handleCount() {
	    let temp = count;	// 可解构生成新对象[...count]
	    temp.push("234");
	    setCount(temp);
	}
	// 不会出发页面优化

在进行setXXX时内部会进行浅比较 if (is(eagerState, currentState)) {return;}
,相等不会触发页面更新。

总结:

  • setXXX属于异步更新;
  • 传参最好是函数,这样再同步调用多次setXXX时状态可复用;
  • 注意传入新对象才会触发更新;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值