You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中useEffect不触发、DOM未更新问题求助

解决React useState数组更新不触发重渲染的问题

嘿,我来帮你搞定这个问题!你遇到的核心问题是直接修改了原状态数组,导致React没检测到状态变化,所以DOM不更新、useEffect也不触发。

问题根源分析

你这段代码里的const arr = mark;并没有创建新数组——它只是把原状态数组的引用赋值给了arr。接下来的arr.push("hello")其实是在直接修改原状态对象,而React的状态管理依赖的是值的引用变化:当你调用setMark返回的还是原来的数组引用时,React会判定状态没有改变,自然不会触发组件重渲染,依赖mark的useEffect也不会执行。

修复方案

要解决这个问题,你需要始终返回全新的数组引用,而不是修改原数组。这里有几种常用的写法:

1. 使用扩展运算符创建新数组

function ChangeValue() {
  // 基于原数组创建新副本,添加新元素
  const newArr = [...mark, "hello"];
  setMark(newArr);
}

2. 使用concat方法返回新数组

function ChangeValue() {
  // concat会返回包含新元素的新数组,不会修改原数组
  const newArr = mark.concat("hello");
  setMark(newArr);
}

3. 函数式更新(推荐,尤其当状态依赖前一次状态时)

function ChangeValue() {
  // 用函数式更新,基于前一次状态创建新数组
  setMark(prevMark => [...prevMark, "hello"]);
}

为什么这样有效?

这些方法都会生成一个全新的数组对象,和原状态数组的引用完全不同。React检测到状态的引用变化后,就会触发组件重渲染,DOM会更新显示新的元素,同时useEffect因为依赖的mark发生了变化,也会执行你写的日志逻辑。

记住:React的状态是**不可变(Immutable)**的,永远不要直接修改状态值,而是通过创建新的状态副本来更新状态,这样React才能正确追踪状态变化哦!

内容的提问来源于stack exchange,提问作者Marcos Oliveira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:56:09