TL; DR - если изменения состояния инициируются асинхронно (например, в обещании), они не будут пакетироваться; если они запускаются напрямую, они будут группироваться.
Я установил песочницу, чтобы попробовать это: https://codesandbox.io/s/402pn5l989
import React, { Fragment, useState } from 'react';
import ReactDOM from 'react-dom';
import './styles.css';
function Component() {
const [a, setA] = useState('a');
const [b, setB] = useState('b');
console.log('a', a);
console.log('b', b);
function handleClickWithPromise() {
Promise.resolve().then(() => {
setA('aa');
setB('bb');
});
}
function handleClickWithoutPromise() {
setA('aa');
setB('bb');
}
return (
<Fragment>
<button onClick={handleClickWithPromise}>
{a}-{b} with promise
</button>
<button onClick={handleClickWithoutPromise}>
{a}-{b} without promise
</button>
</Fragment>
);
}
function App() {
return <Component />;
}
const rootElement = document.getElementById('root');
ReactDOM.render(<App />, rootElement);
Я сделал две кнопки, одна из которых вызывает изменения состояния, обернутые в обещание, как в примере с вашим кодом, а другая вызывает изменение состояния напрямую.
Если вы посмотрите на консоль, когда вы нажмете кнопку «с обещанием», она сначала покажет a aa
и b b
, затем a aa
и b bb
.
Таким образом, ответ - нет, в данном случае он не будет визуализироваться aa - bb
сразу, каждое изменение состояния запускает новый рендеринг, пакетирование не выполняется.
Однако, когда вы нажмете кнопку «без обещания», консоль сразу покажет a aa
и b bb
.
Таким образом, в этом случае React пакетно изменяет состояние и выполняет один рендеринг для обоих вместе.