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)
}
相关推荐
我命由我123453 小时前
React - state、state 的简写方式、props、props 的简写方式、类式组件中的构造器与 props、函数式组件使用 props
前端·javascript·react.js·前端框架·html·html5·js
C澒3 小时前
React + TypeScript 编码规范|统一标准 & 高效维护
前端·react.js·typescript·团队开发·代码规范
@大迁世界6 小时前
精通 React 面试:从零到中高级
前端·javascript·react.js·面试·前端框架
无知的小菜鸡7 小时前
React 零散知识记录
前端·react.js·前端框架
我命由我123458 小时前
React - React 初识、创建虚拟 DOM 的两种方式、jsx 语法规则、React 定义组件
前端·javascript·react.js·前端框架·html·html5·js
白兰地空瓶10 小时前
手写 Mini React:从 0 实现 createElement 和 render,理解 React 的底层原理
react.js
我命由我1234512 小时前
前端开发 - this 指向问题(直接调用函数、对象方法、类方法)
开发语言·前端·javascript·vue.js·react.js·html5·js
Olafur_zbj12 小时前
【AI】深度解析OpenClaw智能体循环(Agentic Loop):底层运行机制、ReAct演进与多智能体协同架构
人工智能·react.js·架构·agent·openclaw
我命由我1234512 小时前
React - ref、回调 ref 回调执行次数的问题、createRef 函数、事件处理
前端·javascript·react.js·前端框架·html·html5·js
我命由我1234512 小时前
React - 收集表单元素、收集表单元素优化、生命周期(旧)、生命周期(新)
前端·javascript·react.js·前端框架·html·html5·js