返回博客

React useState 更新数组无效的问题及解决方法

使用 React 的 useState 更新数组时,如果直接修改数组引用,React 可能无法检测到变化,导致页面不更新。本文解释了原因并提供了有效的解决方法,例如使用展开运算符 ([...array]) 创建新的数组副本。

Mt.r
|

问题

有一次使用了 useState 方法更新数组,但是数据没有发生变化。

const [array, setArray] = useState([]);

let data = [];

for (let index = 0; index < 10; index++) {
  data = [index, index + 1, index + 2];
  setArray(data);
}

console.log(array); //输出 [0,-1,-2]

原因及解决方法

由于时间原因,我没太查资料,我猜测是 data 的指针是同一个,所以触发 setArray 的时候,是不会做 diff 检查的,也就是说检查不到数组的变化。

上面都是我个人的猜测,解决方法是用 [...data] 新建一个数组,这时候指针发生了变化,setArray 自热就生效了。对于对象的操作估计也可以用 {...data} 的方式去更新。

代码如下

let data = [];

for (let index = 0; index < 10; index++) {
  data = [index, index + 1, index + 2];
  setArray([...data]);
}

如果还是不太明白,看一下这个你大概就可以猜到原因了。

true === true // true
false === false // true
1 === 1 // true
'a' === 'a' // true

{} === {} // false
[] === [] // false
() => {} === () => {} // false

const z = {}
z === z // true