React-useEffect的闭包陷阱(stale closure)

React-useEffect的闭包陷阱(stale closure)

javascript 复制代码
import { useEffect, useState, useRef } from 'react';

/**
 *  c1 始终为1
 *  c2 为从1开始的递增最新值
 * c2 1
 * c1 1
 * c2 2
 * c1 1
 * c2 3
 * c1 1	
 */
export default function EffectTest(){
    const [c, setC] = useState(1);
    const buttonRef = useRef(null);
    useEffect(() => {
        buttonRef.current.addEventListener('click', () => {
            setC((value) => {
                console.log('c2', value);
                return value + 1;
            });
            console.log('c1', c);
        });
    }, []);

    return (
        <div>
            <button ref={buttonRef} >addC</button>
        </div>
    );
}
``