![低代码平台开发实践:基于React](https://wfqqreader-1252317822.image.myqcloud.com/cover/617/50417617/b_50417617.jpg)
1.3.1 useState
useState是一个与状态管理相关的Hooks,能让函数组件拥有状态,是最常用的Hooks之一,类型定义如下。
![](https://epubservercos.yuewen.com/10262B/29686504404601406/epubprivate/OEBPS/Images/978-7-111-74689-8_16_02.jpg?sign=1738801873-IDz0Wlu07njenX6ku0XqV2se0pgJHF9m-0-659aaf94d5ec8142078685dfd5d70da7)
从类型定义可以看出,useState有两个重载,分别是传参数和不传参数。不论是否传参数,useState都返回一个长度为2的数组。数组的第一个位置是状态,可以是任何数据类型,类型参数S用于注释它的类型;第二个位置是一个用于更新状态的函数,为了方便介绍本小节将该函数记为setState。
接下来介绍useState的基本用法。
1.useState的参数不是函数
此时,useState的参数将作为状态的初始值,如果没有传参数,那么状态的初始值为undefined。用法如下。
![](https://epubservercos.yuewen.com/10262B/29686504404601406/epubprivate/OEBPS/Images/978-7-111-74689-8_17_01.jpg?sign=1738801873-i1Bgr0Hv5XbkzfzNFpJXC18ayFE8fstN-0-db6bb953918365e8415b96f84e6e1471)
UseStateWithoutFunc组件有name和age这两个状态,name只能是string类型,初始值为'何遇',age的数据类型是number或undefined,初始值为undefined。
2.useState的参数是函数
此时,函数的返回值是状态的初始值。某些时候,状态的初始值要经过计算才能得到,此时推荐将函数作为useState的参数,该函数只在组件初始渲染时执行一次。用法如下。
![](https://epubservercos.yuewen.com/10262B/29686504404601406/epubprivate/OEBPS/Images/978-7-111-74689-8_17_02.jpg?sign=1738801873-YlIegBYatCvCkQwVOtrk6tyefADi5Dyu-0-75c4b85cafc07854a7af2c95e115e262)
![](https://epubservercos.yuewen.com/10262B/29686504404601406/epubprivate/OEBPS/Images/978-7-111-74689-8_18_01.jpg?sign=1738801873-BF9iZYWOeKdYSrLpWEtoJ29zbS3imiEt-0-e7edc7b3d056593b13ddbb7ffdb36fd7)
上述useState的参数是函数,该函数的返回值是count的初始值。
3.修改状态的值
沿用上述代码中的setCount,修改状态有两种方式,具体如下。
![](https://epubservercos.yuewen.com/10262B/29686504404601406/epubprivate/OEBPS/Images/978-7-111-74689-8_18_02.jpg?sign=1738801873-HiISzvfmvALWdQXtCmPHFgBAXnkaHZXS-0-64d2d2d12b6733462b4ef95ee9c54018)
如果setCount的参数是函数,那么count现在的值将以参数的形式传给该函数,函数的返回值用于更新状态。如果setCount的参数不是函数,那么该参数将用于更新状态。状态值发生变更将导致组件重新渲染,重新渲染时,useState返回的第一个值始终是状态最新的值,不会重置为初始值。
目前已经介绍完useState的基本用法,观察代码清单1-1所示代码,分析浏览器打印的结果。
代码清单 1-1
![](https://epubservercos.yuewen.com/10262B/29686504404601406/epubprivate/OEBPS/Images/978-7-111-74689-8_18_03.jpg?sign=1738801873-KSMCt7fjyIlwYKnMrp1AMLvW6XjWFA5c-0-3b846cd37ad212e825e9102e7e0975a7)
如果你理解1.1节中讲的知识,那么一定能轻而易举地分析出浏览器打印的值是0而不是1,这是因为在函数组件中取state和props拿到的都是本次渲染的值,在本次渲染范围内,props和state始终不变。
在代码清单1-1中调用setCount会导致组件重新渲染,在下一次渲染时count的值为1,但console.log(count)打印的是本次渲染时count的值,所以结果为0。