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

React Hooks滚动监听导致已卸载组件状态更新报错如何解决

问题原因

你写的useEffect清理逻辑存在错误,组件卸载时没有移除之前绑定的滚动监听事件,反而新增了一次监听。未被移除的事件在页面滚动时仍然会触发,尝试更新已经卸载的首页组件状态,因此触发了内存泄漏告警。

修复方案

直接修正useEffect的清理逻辑,在组件卸载时调用removeEventListener移除滚动监听即可:

useEffect(() => {
    window.addEventListener('scroll', handleDisplays)
    // 清理函数:组件卸载时移除监听
    return  () => {
        window.removeEventListener('scroll', handleDisplays)
    } 
}, [])

如果想要做更稳妥的兜底,可以新增组件挂载状态标识,避免极端情况下的状态更新报错:

useEffect(() => {
    // 组件挂载标识
    let isMounted = true
    const handleDisplays = () => {
        // 组件已卸载时直接终止逻辑,不执行状态更新
        if (!isMounted) return
        if (window.scrollY > 0) {
            setNavbar(true)
        } else {
            setNavbar(false)
        }

        if (window.scrollY > 1000) {
            setHelpDisplay(true)
        } else {
            setHelpDisplay(false)
        }

        if (window.scrollY > 1400) {
            setContactDisplay(true)
        } else {
            setContactDisplay(false)
        }
    }

    window.addEventListener('scroll', handleDisplays)
    return () => {
        // 卸载时修改标识,同时移除监听
        isMounted = false
        window.removeEventListener('scroll', handleDisplays)
    }
}, [])

内容的提问来源于stack exchange,提问作者Cihan Özcan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:06:01