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

如何让useEffect仅在状态变化时执行而非组件挂载时?

问题原因及解决方案

你遇到的问题根源在于JavaScript中对象的引用比较机制:currentTarget !== {}这个判断永远会返回true,哪怕currentTarget是默认的空对象。因为两个空对象是不同的内存引用,不是同一个对象,所以条件会成立,导致组件挂载时就执行了里面的逻辑。

解决方法有两种:

方法1:检查空对象的实际内容

通过判断对象的键数量来确定是否是有意义的目标对象,默认空对象的键长度为0,当状态更新为包含_id的有效对象时,键长度大于0:

useEffect(() => {
  if (Object.keys(currentTarget).length > 0) {
    console.log(currentTarget)
    fetchChat()
  }
}, [currentTarget])

方法2:修改状态默认值为null

把currentTarget的默认值从空对象改成null,这样直接判断是否不等于null即可,挂载时currentTarget为null,不会触发逻辑,只有当状态更新为有效对象时才执行:

// 先修改状态初始化
const [currentTarget, setCurrentTarget] = useState(null);

// 再修改useEffect判断
useEffect(() => {
  if (currentTarget !== null) {
    console.log(currentTarget)
    fetchChat()
  }
}, [currentTarget])

这两种方法都能实现你要的效果:仅在currentTarget状态从默认值变为有效对象时执行逻辑,组件挂载时不会触发。

内容的提问来源于stack exchange,提问作者Romeo Richardson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:05:37