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

ReactJS自定义Window事件中无法获取最新Props状态的技术求助

React组件window点击事件无法获取最新props的解决方案

问题原因

你遇到的问题是因为useEffect绑定window点击事件时,回调函数捕获了当时的page值,后续page更新后,旧的回调函数并没有被替换,所以打印的还是初始绑定的旧值。

解决方法

方法1:将props加入useEffect依赖数组,重新绑定事件

每次page更新时,移除旧的事件监听,绑定新的回调(此时回调会捕获最新的page值):

import { useEffect } from 'react';

function TestFun({ page }) {
  useEffect(() => {
    const handleWindowClick = () => {
      console.log('最新page值:', page);
    };

    window.addEventListener('click', handleWindowClick);
    // 清理旧事件,避免内存泄漏
    return () => window.removeEventListener('click', handleWindowClick);
  }, [page]); // 依赖数组添加page,触发重新执行

  return <div>当前页面:{page}</div>;
}

方法2:用useRef存储最新props,避免频繁绑定事件

如果不想每次page变化都解绑/绑定事件,可以用useRef实时同步最新的page值,事件回调直接取ref.current:

import { useEffect, useRef } from 'react';

function TestFun({ page }) {
  const latestPageRef = useRef(page);

  // 同步最新的page到ref
  useEffect(() => {
    latestPageRef.current = page;
  }, [page]);

  useEffect(() => {
    const handleWindowClick = () => {
      console.log('最新page值:', latestPageRef.current);
    };

    window.addEventListener('click', handleWindowClick);
    return () => window.removeEventListener('click', handleWindowClick);
  }, []); // 空依赖数组,只绑定一次事件

  return <div>当前页面:{page}</div>;
}

注意事项

  • 方法1的优势是简单直观,适合page不频繁更新的场景;
  • 方法2适合page更新频繁的场景,减少事件绑定的开销;
  • 之前用useRef没生效,大概率是没做page到ref.current的同步步骤,一定要加那个单独的useEffect来更新ref值。

内容的提问来源于stack exchange,提问作者Elcid_91

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:55:22