Как устроен батчинг в React v18.0
1️⃣ Как кратко ответить
В React v18.0 батчинг объединяет несколько обновлений состояния в один рендеринг, чтобы повысить производительность. Это происходит автоматически для всех обновлений, вызванных внутри событийных обработчиков и асинхронных функций, таких как setTimeout или fetch, благодаря новой функции automatic batching.
2️⃣ Подробное объяснение темы
Батчинг в React — это процесс объединения нескольких обновлений состояния в один рендеринг компонента. Это позволяет уменьшить количество рендеров и повысить производительность приложения. В React v18.0 батчинг стал более мощным благодаря введению автоматического батчинга.
Зачем нужен батчинг?
Когда в React обновляется состояние, компонент рендерится заново. Если несколько обновлений состояния происходят одновременно, без батчинга каждый из них вызовет отдельный рендеринг, что может привести к снижению производительности. Батчинг позволяет объединить эти обновления и выполнить один рендеринг, что делает приложение более эффективным.
Как работает батчинг в React v18.0?
До версии 18.0 React выполнял батчинг только для обновлений, происходящих внутри событийных обработчиков. Например, если вы изменяли состояние в ответ на клик, React объединял эти изменения в один рендеринг. Однако, если обновления происходили в асинхронных функциях, таких как setTimeout или fetch, они не объединялись.
С выходом React v18.0 был введен автоматический батчинг, который работает и для асинхронных функций. Это означает, что теперь React автоматически объединяет все обновления состояния, происходящие в одном цикле событий, независимо от их источника.
Пример кода
Рассмотрим пример, чтобы понять, как это работает:
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const [text, setText] = useState('');
const handleClick = () => {
// Обновление состояния внутри обработчика события
setCount(count + 1);
setText('Updated');
// Оба обновления будут объединены в один рендеринг
};
const handleAsyncUpdate = () => {
setTimeout(() => {
// Обновление состояния внутри асинхронной функции
setCount(count + 1);
setText('Updated asynchronously');
// В React v18.0 оба обновления также будут объединены в один рендеринг
}, 1000);
};
return (
<div>
<p>Count: {count}</p>
<p>Text: {text}</p>
<button onClick={handleClick}>Update Synchronously</button>
<button onClick={handleAsyncUpdate}>Update Asynchronously</button>
</div>
);
}
export default Counter;
Объяснение кода:
- Импортируем необходимые хуки:
useStateиз React для управления состоянием. - Создаем компонент
Counter: Внутри него определяем два состояния:countиtext. - Функция
handleClick: Обновляет оба состояния синхронно. В React v18.0 эти обновления будут объединены в один рендеринг. - Функция
handleAsyncUpdate: ИспользуетsetTimeoutдля асинхронного обновления состояний. В React v18.0 эти обновления также будут объединены в один рендеринг благодаря автоматическому батчингу. - Рендеринг компонента: Отображает текущее значение
countиtext, а также две кнопки для вызова функций обновления.
Применение
Автоматический батчинг в React v18.0 упрощает разработку, так как разработчикам не нужно вручную заботиться о том, чтобы объединять обновления состояния. Это делает код более чистым и улучшает производительность приложений, особенно тех, которые активно используют асинхронные операции.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться