Antd Form onFinish 提交时 setState 非批量执行(batch update)
import React, { useState, useEffect } from 'react';
import ReactDOM from 'react-dom';
import 'antd/dist/antd.css';
import './index.css';
import { Button, Form } from 'antd';
const useSearch = () => {
const [current, setCurrent] = useState(0);
const [page, setPage] = useState(0);
useEffect(() => {
console.log('current=', current);
console.log('page=', page);
}, [current, page]);
const handleClick = () => {
console.log('=============');
setCurrent(current + 1);
console.log('1');
setPage(page + 1);
console.log('2');
};
return { handleClick };
};
const Demo = () => {
const { handleClick } = useSearch();
return (
<Form onFinish={handleClick}>
<Form.Item>
<p>
<Button type="primary" htmlType="submit">
非批量更新
</Button>
</p>
<p>
<Button type="primary" onClick={handleClick}>
批量更新
</Button>
</p>
</Form.Item>
</Form>
);
};
ReactDOM.render(<Demo />, document.getElementById('container'));
原因:onFinish 会引入其他微任务,react官方计划在18版本修复没有批量更新的问题
解法一:
仅用button的onClick即可避免
解法二:
使用 unstable_batchedUpdates
手动批量更新state
import { unstable_batchedUpdates } from "react-dom";
unstable_batchedUpdates(() => {
setState_1(1);
setState_2(2);
setState_3(3);
});