React组件中监听函数获取不到最新的state

react组件中使用监听函数,无法获取最新state,打印的state一直是初始默认值

export default function Travel(props) {
    const divRef = useRef(null)
    const [count, setCount] = useState(0)
    const handleClick = () => {
        console.log('click',count);
    }

    useEffect(() => {
        window.addEventListener('click', handleClick)
        return () => {
            window.removeEventListener('click', handleClick)
        }
    },[])
    console.log('out',count);


    return (
        <div ref={divRef} >
            <button onClick={() => {
        setCount(count => count + 1)

            }}>点击</button>
        </div>
    )
}

原因:
因为监听器绑定的是第一次render时生成的函数,这个函数的上下文中的state也是第一次的值,所以即便后面render了多次,因为绑定的是第一次render的函数,所以state值也是旧的

解决:


useEffect(() => {
    window.addEventListener('click', handleClick)
    return () => {
        window.removeEventListener('click', handleClick)
    }
},[count])

另一写法

export default function Travel(props) {
    const divRef = useRef(null)
    const [count, setCount] = useState(0)

    const handleClick = () => {
        console.log('click', count);
    }

    useEffect(() => {
        if (divRef && divRef.current) {
            divRef.current.addEventListener('click', handleClick)

        }
        return () => {
            divRef.current.removeEventListener('click', handleClick)

        }
    },[count])
    console.log('out', count);


    return (
        <div ref={divRef} >
            tracel
            <button onClick={() => {
                setCount(count => count + 1)

            }}>点击</button>
        </div>
    )
}

resize监听

export default function Travel(props) {
    const divRef = useRef(null)
    const [count, setCount] = useState(0)

    const handleClick = () => {
        console.log('click', count);
    }

    useEffect(() => {
      
            window.addEventListener('resize', handleClick)

        
        return () => {
            window.removeEventListener('resize', handleClick)

        }
    },[count])
    console.log('out', count);


    return (
        <div ref={divRef} >
            tracel
            <button onClick={() => {
                setCount(count => count + 1)

            }}>点击</button>
        </div>
    )
}
React中,如果你使用G6库创建图形并尝试监听组件内部的状态变化,但是发现无法接收到最新的状态更新,可能是以下几个原因: 1. **事件绑定时机问题**:确保你在`componentDidMount()`、`useEffect`等生命周期方法内添加了状态更改后的回调,因为只有在这些时候,React才保证已经完成了DOM更新。 ```jsx componentDidMount() { this.graph.on('dataUpdate', this.handleGraphStateChange); } // ...其他代码... handleGraphStateChange = () => { // 更新UI或其他操作 }; ``` 2. **深拷贝问题**:如果G6的数据结构发生变化,需要确保你在处理数据的时候进行了深拷贝,避免直接修改引用导致的视图未更新。 3. **纯函数优化**:`PureComponent`或`functional component`会基于prop和state是否改变来决定是否渲染。如果你的回调函数依赖于状态的一部分,而不是整个状态,可能会被优化掉。在这种情况下,可以考虑改用`React.memo`包裹回调,或者使用`useState`代替`setState`。 4. **异步问题**:如果G6的行为涉及异步操作,比如网络请求,你需要确保在数据返回后再触发状态更新,并相应地调整监听逻辑。 5. **错误处理**:检查是否有未捕获的错误导致状态无法正常更新,或者G6本身是否存在问题。 如果遇到此类问题,建议使用`console.log`或者`debugger`临时监控状态的变化,以及查看G6官方文档和社区解决方案。同时别忘了检查G6的版本是否兼容当前项目。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值