1、useState 为数组
1)反例
定义一个 useState 和生成数据的方法
| 12
 3
 4
 5
 6
 
 | const [rows, setRows] = React.useState([]);
 function createData(column1, column2, column3, column4) {
 const column5 = column3 / column4;
 return { column1, column2, column3, column4, column5 };
 }
 
 | 
按照常规,试图增加元素时,使用以下代码是不生效的:
| 1
 | setRows([...rows, createData(column1, column2, column3, column4)]);
 | 
如果取 rows 遍历,发现数组只会有最后更新的元素
2)正例
| 1
 | setRows((prevRows) => [...prevRows,createData(column1, column2, column3, column4),]);
 | 
2、 useEffect 中使用定时器所产生的闭包陷阱
1)反例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | const callBack = () => {……
 
 setRows((prevRows) => [...prevRows, createData(column1, column2, column3, column4)])
 }
 
 useEffect(() => {
 const intervalId = setInterval({
 ……
 setRows((prevRows) => [...prevRows, createData(column1, column2, column3, column4)])
 }, 5000)
 console.log('intervalId=' + intervalId)
 
 return () => clearInterval(intervalId)
 }, [])
 
 | 
运行后观察控制台,会不断输出计时器 id,说明每次执行间隔就创建一次。有关说明可见文章:making-setinterval-declarative-with-react-hooks
2)正例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | const intervalRef = useRef()
 const callBack = () => {
 ……
 
 setRows((prevRows) => [...prevRows, createData(column1, column2, column3, column4)])
 }
 
 useEffect(() => {
 intervalRef.current = callBack
 return () => {}
 })
 
 useEffect(() => {
 const tick = () => {
 intervalRef.current()
 }
 const intervalId = setInterval(tick, 5000)
 console.log('intervalId=' + intervalId)
 
 return () => clearInterval(intervalId)
 }, [])
 
 |