State Hook 是一个在函数组件中使用的函数(useState),用于在函数组件中使用状态。
useState:
- 有一个参数,表示状态的默认值
- 返回值是一个数组,该数组一定包含两项
- 第一项:当前状态的值
- 第二项:改变状态的函数
一个函数组件可以有多个状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import React, {useState} from "react";
export default function StateHookTest() { const [count, setCount] = useState(0); const [visible, setVisible] = useState(true) return <> <div style={{ display:visible?"block":"none" }}> <button onClick={()=>{ setCount(count-1) }}>-</button> <span>{count}</span> <button onClick={()=>{ setCount(count+1) }}>+</button> </div> <p> <button onClick={()=>{ setVisible(!visible) }}>切换显示/隐藏</button> </p> </>; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
import React, {useState} from "react";
export default function StateHookTest() { const [data, setData] = useState({count:0,visible:true}); return <> <div style={{ display:data.visible?"block":"none" }}> <button onClick={()=>{ setData({ ...data, count:data.count-1 }) }}>-</button> <span>{data.count}</span> <button onClick={()=>{ setData({ ...data, count:data.count+1 }) }}>+</button> </div> <p> <button onClick={()=>{ setData({ ...data, visible:!data.visible }) }}>切换显示/隐藏</button> </p> </>; }
|
注意:
- useState最好写在函数的起始位置,便于阅读
- useState严禁出现在代码块(判断、循环)中
- useState返回的第二个参数(函数)的引用不变(节约内存空间)
- 如果使用函数改变数据,若数据改变前后完全相等(使用Object.is比较),不会导致重新渲染(优化效率)
- 使用函数改变数据,传入的值不会和原来的数据混合,会直接替换
- 实现强制刷新
- 类组件:使用forceUpdate函数
- 函数组件:使用一个空对象的useState
- 如果某些状态之间没有必然的联系,应该分化为不同的状态,最好不要合并成一个对象
- 函数组件中改变状态可能是异步的(在DOM事件中),多个状态会合并以提高效率,此时不能信任之前的状态,而应该使用回调函数的方式改变状态,如果状态变化要使用之前的状态,尽量传递函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import React, {useState} from "react";
export default function StateHookTest() { const [count, setCount] = useState(0); const [visible, setVisible] = useState(true) return <> <div style={{ display:visible?"block":"none" }}> <button onClick={()=>{ // 异步的,多个状态会合并,应该使用回调函数 setCount(count=>count-1) setCount(count=>count-1) }}>-</button> <span>{count}</span> <button onClick={()=>{ setCount(count=>count+1) setCount(count=>count+1) }}>+</button> </div> <p> <button onClick={()=>{ setVisible(!visible) }}>切换显示/隐藏</button> </p> </>; }
|