这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战
Hooks意为钩子,React Hooks就是一堆钩子函数,React通过这些钩子函数对函数型组件进行增强,不同的钩子函数提供了不同的功能。钩子函数有一个特点,都是以use开头。
为函数组件提供状态
useState函数的内部是使用闭包来实现函数保存状态数据的。
useState的返回值是什么?
返回值是一个数组,数组的第一项是状态数据,第二项是设置状态数据的方法,关于这个第二项的命名,我们一般采用set+状态数据名的方法,请看下面的例子。
const [count,setCount] = useState(0); 复制代码
useState的细节
- 接收唯一的参数即状态初始值,初始值可以是任意数据类型。
- 返回值为数组,数组中存储状态值和更改状态值的方法,方法名称约定以set开头,后面加上状态名称。
- 方法可以被调用多次,用以保存不同的状态值。
- 参数可以是一个函数,函数返回什么,初始状态就是什么,函数只会被调用一次,用在初始值是动态值的情况。
function App(props) { const [count,setCount] = useState(() => { return props.count || 10; }); const [person,setPerson] = useState({name: 'justin'}) return ( <div> <span>{count},{person.name}</span> <br /> <button onClick={() => setCount(count + 1)}>+1</button> <button onClick={() => setPerson({name: '国家'})}>点击切换name</button> </div> ) } 复制代码
useState更新状态时是异步的
function App(props) { const [count,setCount] = useState(0); const [person,setPerson] = useState({name: 'justin'}) function handleCount() { setCount(() => { return count + 1; }) console.log(count); // 打印的是0,说明是异步的 } return ( <div> <span>{count},{person.name}</span> <br /> <button onClick={handleCount}>+1</button> <button onClick={() => setPerson({name: '国家'})}>点击切换name</button> </div> ) } 复制代码
读取state
在class的写法中,读取state需要使用this.state,但是在hook写法中,只需要直接使用状态的变量名即可。
为什么叫useState而不叫createState?
因为Create一词并不是很准确,因为state只在组件首次渲染的时候被创建,在下一次重新渲染的时候,useState返回给我们当前的state。