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

为何空依赖useEffect绑定的resize函数会在窗口缩放时持续触发?

问题解析:窗口缩放时resized函数持续触发的原因

你的代码

const [innerWidth, setInnerWidth] = useState(window.innerWidth)

function resized () {
    setInner(window.innerWidth)
}

useEffect(()=>{
    window.addEventListener('resize', resized)

    return () => {
      window.removeEventListener('resize', resized)
    }
}, [])

核心误解

你混淆了「事件绑定的执行次数」和「事件触发的次数」:

  • useEffect空依赖确实只会在组件挂载时执行一次,也就是只给window绑定了一次resize事件监听,这部分完全符合你的预期。
  • 但resize事件本身的特性就是:只要浏览器窗口尺寸发生变化,就会持续触发这个事件——哪怕只绑定一次,每次窗口缩放都会调用resized函数,这是浏览器的原生行为,和绑定次数无关。

额外代码错误

你代码里的resized函数调用了setInner,但你声明的状态更新函数是setInnerWidth,这里会导致报错,需要改成setInnerWidth(window.innerWidth)。

优化方案(如果想减少触发频率)

如果你的需求是避免窗口缩放时频繁更新状态,可以给事件处理加防抖:

const [innerWidth, setInnerWidth] = useState(window.innerWidth)

useEffect(()=>{
  // 防抖定时器
  let timer = null
  const resized = () => {
    clearTimeout(timer)
    // 窗口停止缩放200ms后再更新状态
    timer = setTimeout(() => {
      setInnerWidth(window.innerWidth)
    }, 200)
  }

  window.addEventListener('resize', resized)

  return () => {
    window.removeEventListener('resize', resized)
    // 组件卸载时清理定时器
    clearTimeout(timer)
  }
}, [])

内容的提问来源于stack exchange,提问作者Akshay Tambe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:36:52