为什么 useState 的状态更新后组件没重新渲染?

恒菽 ☘︎ 阅读 4

我用 useState 定义了一个数组状态,push 新元素后发现页面没变化,明明数据已经改了啊?

试过直接修改原数组再 setState,也试过用扩展运算符生成新数组,但有时候还是不生效,是不是哪里写错了?

const [items, setItems] = useState([1, 2, 3]);

// 点击按钮执行这个函数
const addItem = () => {
  items.push(4); // 这样改好像不行?
  setItems(items);
};
我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
慧娜
慧娜 Lv1
这个问题的关键是 React 的状态更新机制。在 React 中,useState 返回的状态更新函数 setItems 只会在新的状态值与旧的状态值不同时才会触发重新渲染。这里的问题在于直接使用 items.push(4) 修改了原数组,然后又使用 setItems(items) 设置了同一个引用的数组,React 认为状态没有变化,因此不会触发重新渲染。

正确的做法是创建一个新的数组对象,而不是修改原数组。可以使用扩展运算符来实现这一点。下面是修正后的代码示例:

const [items, setItems] = useState([1, 2, 3]);

// 点击按钮执行这个函数
const addItem = () => {
// 使用扩展运算符创建一个新的数组
const newItems = [...items, 4];
// 设置新的数组状态
setItems(newItems);
};


这里的关键在于 const newItems = [...items, 4]; 这一行代码。通过使用扩展运算符 ...items,我们复制了 items 数组的所有元素,并添加了新的元素 4,从而创建了一个全新的数组对象 newItems。然后,我们将这个新的数组对象传递给 setItems 函数,这样 React 才能检测到状态的变化并触发重新渲染。

如果你尝试直接修改原数组然后调用 setState,React 检测到的是同一个数组引用,因此认为状态没有变化,也就不会重新渲染组件了。这就是为什么直接 items.push(4) 不起作用的原因。希望这个解释能够帮助你理解其中的原理。
点赞
2026-03-25 14:00