![低代码平台开发实践:基于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=1738974885-7dwjQHLqb5bAEzeGelTC2e6APUGiAy5e-0-4b8155365d0899c25b96c941a9ec9d9a)
从类型定义可以看出,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=1738974885-DFMsrKcWZ8RIZmsmrznKz3zVSWvCbwK0-0-251829fe4c0582fa66cf8ad0b5bf7ba7)
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=1738974885-kvNN1WYd8rSRbNQA9UxiVOO81vjPKxFX-0-a37d79eaf41f84b13ddfb1f38c7bdade)
![](https://epubservercos.yuewen.com/10262B/29686504404601406/epubprivate/OEBPS/Images/978-7-111-74689-8_18_01.jpg?sign=1738974885-LFCxf4gPE54fHzwsTGXE3JVHr9RXHYGh-0-af3699dd099c63c984c8b843ac219c6c)
上述useState的参数是函数,该函数的返回值是count的初始值。
3.修改状态的值
沿用上述代码中的setCount,修改状态有两种方式,具体如下。
![](https://epubservercos.yuewen.com/10262B/29686504404601406/epubprivate/OEBPS/Images/978-7-111-74689-8_18_02.jpg?sign=1738974885-Ps1QofPI4G3m71ax06MHOVV7ACcldwOJ-0-01adb6a28f41a72569de8a074bcab57d)
如果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=1738974885-fPofy7vOh5DlcRPwwxp0vwEHCYVUulCu-0-d4ab8fb6c0dc254719f31bf3bc90b8d7)
如果你理解1.1节中讲的知识,那么一定能轻而易举地分析出浏览器打印的值是0而不是1,这是因为在函数组件中取state和props拿到的都是本次渲染的值,在本次渲染范围内,props和state始终不变。
在代码清单1-1中调用setCount会导致组件重新渲染,在下一次渲染时count的值为1,但console.log(count)打印的是本次渲染时count的值,所以结果为0。