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)
}
相关推荐
空中海12 小时前
01 React Native 基础、核心组件与布局体系
javascript·react native·react.js
空中海12 小时前
05 React架构设计、项目实践与专家清单
前端·react.js·前端框架
空中海14 小时前
04 工程化、质量体系与 React 生态
前端·ubuntu·react.js
空中海14 小时前
03 性能、动画与 React Native 新架构
react native·react.js·架构
空中海16 小时前
02 React Native状态、导航、数据流与设备能力
javascript·react native·react.js
空中海17 小时前
04 React Native工程化、质量、发布与生态选型
javascript·react native·react.js
郑生zs19 小时前
Hooks-useEffect
react.js
光影少年19 小时前
react函数组件、类组件、纯组件、受控/非受控组件
前端·react.js·掘金·金石计划
空中海21 小时前
05 React Native架构设计、主线项目与专家实践
javascript·react native·react.js
killerbasd1 天前
还是迷茫 5.3
前端·react.js·前端框架