react中添加窗口监听后hook保存数据获取异常问题

不知道你有没有遇到 react hooks 时添加窗口监听中的问题,使用 useEffect 中添加窗口监听的时候,访问 useState 中的参数时,会返回 useState 给定的初始数据,这个问题可能会令很多人头疼,不知道问题出现在哪里,下面就提供给解决方案

错误案例示范

js 复制代码
const [data, setData] = useState<string[]>([])

useEffect(() => {
        setData(["123", "456"])

        window.addEventListener('resize', onResize); 
        return () => {
            window.removeEventListener('resize', onResize)
        }
}, [])

const onResize = () => {
    //会发现打印的data一直为初始值,设置为新的下次访问也是初始值
    console.log(data)
}

问题与解决方案

当我们使用 addEventListener 监听数据 时,无法正确获取 useState 中的值,其会获取到最初始的数据(猜测原因可能是绑定函数时捕获的 data 对象是最初始的 state,当 state 更新时会生成一个新的 state,且被捕获的 state 没有更新为最新的 state,因此获取到的不是更新后的 state)

因此,我们需要重新绑定监听,然后就可以获取到 useState 中的数据了,只需要 useEffect 中监听 data 即可(新起一个useEffect,可以直接避免监听导致的递归问题,也可以在一个里面手动处理)

示范改进

js 复制代码
const [data, setData] = useState<string[]>([])

useEffect(() => {
    setData(["123", "456"])
}, [])

useEffect(() => {
     window.addEventListener('resize', onResize); 
    return () => {
        window.removeEventListener('resize', onResize)
    }
}, [data])

const onResize = () => {
    //会发现打印的data一直为初始值,设置为新的下次访问也是初始值
    console.log(data)
}
相关推荐
名字还没想好☜1 小时前
React setState 连续调用「丢更新」排查:批量更新与函数式更新
前端·javascript·react.js·react·usestate
sugar__salt1 小时前
DeepSeek-R1 WebGPU (1):在浏览器里跑大模型
react.js·reactjs·react·端模型
张元清2 小时前
React useCookie Hook:把 Cookie 变成响应式状态(2026)
javascript·react.js
索西引擎3 小时前
【React】Immer.js 在现代 Redux 生态中的角色:不可变性保障的工程化实现与开发体验优化
前端·javascript·react.js
kisshyshy3 小时前
《川剧变脸 × React 状态管理?我在浏览器里跑了个端侧大模型》
前端·react.js·架构
只一3 小时前
端侧AI实战第二章:React组件工程化 + 事件系统 + 可复用进度条(WebGPU模型加载底座)
前端·react.js
GuWen_yue3 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
javascript·react.js·langchain
用户298698530143 小时前
React 项目中灵活管理 Excel 工作表:增删与移动
javascript·react.js·excel
bonechips3 小时前
React + WebGPU(二):合成事件与进度条组件封装
前端·react.js
我是大卫3 小时前
【图】React源码解析-从底层数据结构、渲染调度到闭包原理深挖useRef的核心机制
前端·react.js·源码