Hooks里对state的更新,在同一个event handler里,是会batch的,即使有promise等async操作

    1. const { useState, useEffect, } = React;
    2. function Test() {
    3. const [counter, setCounter] = useState(0);
    4. const [counter1, setCounter1] = useState(0);
    5. const [renderCnt, setRenderCnt] = useState(0);
    6. const handleClick = () => {
    7. setCounter(counter+1); // comment out this to see the diff action
    8. (new Promise((resolve) => setTimeout(() => {resolve()}, 1000))).then(res => {
    9. setCounter(counter+1);
    10. setCounter1(counter1+1)
    11. })
    12. };
    13. useEffect(() => {
    14. setRenderCnt(renderCnt + 1)
    15. }, [counter, counter1]); // here we also dep on counter1, the render will not be batched though
    16. return (
    17. <div>
    18. <p>You clicked {counter} times</p>
    19. <button onClick={handleClick}>
    20. Click me
    21. </button>
    22. <p>Rendered {renderCnt} times</p>
    23. </div>
    24. );
    25. }
    26. ReactDOM.render(<Test />, document.querySelector("#app"))

    但是,render的话,却会因为async操作的存在而不能被batch。