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>
    )
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值