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)
}
相关推荐
太子釢17 小时前
React 函数组件与 Hook 实践指南
前端·react.js
liangshanbo121518 小时前
面试题:React 中 Lane 和 Scheduler 是怎么配合的?
前端·react.js·前端框架
liangshanbo121518 小时前
React面试题:Hooks 为什么不能在分支和循环里面写?
前端·javascript·react.js
FungLeo18 小时前
成为全栈·Next.js 网站前台篇·响应式、可访问性与错误状态:内容站不能只验桌面首页
react.js·响应式设计·next.js·移动端适配·成为全栈·web 可访问性
ss27319 小时前
AI全栈实战 | 3.5-01 Python 全栈前端最小集:不会 React 也能做出能看的后台,关键就一条线
前端·python·react.js
记得开心一点嘛2 天前
Trellora:基于 Electron、React 和本地知识库的 AI 知识工作台
人工智能·react.js·electron
500842 天前
React Native for OpenHarmony 实战:三方库 react-native-url-polyfill 的鸿蒙化适配指南
javascript·react native·react.js·性能优化·electron·harmonyos
500842 天前
React Native for OpenHarmony 实战:三方库 react-native-volume-control 的鸿蒙化适配指南
javascript·react native·react.js·electron·harmonyos
薛一半2 天前
React-Redux三重优化实战揭秘
javascript·vue.js·react.js
薛一半4 天前
React-Redux核心原理与容器组件实战
前端·javascript·react.js