← Назад ко всем вопросам

Как устроен батчинг в 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 упрощает разработку, так как разработчикам не нужно вручную заботиться о том, чтобы объединять обновления состояния. Это делает код более чистым и улучшает производительность приложений, особенно тех, которые активно используют асинхронные операции.

Тема: React
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки