Bahasa Indonesia

Pelajari bagaimana batching otomatis React mengoptimalkan beberapa pembaruan state, meningkatkan performa aplikasi dan mencegah re-render yang tidak perlu.

Batching Otomatis React: Mengoptimalkan Pembaruan State untuk Performa

Performa React sangat penting untuk menciptakan antarmuka pengguna yang mulus dan responsif. Salah satu fitur utama yang diperkenalkan untuk meningkatkan performa adalah batching otomatis. Teknik optimisasi ini secara otomatis mengelompokkan beberapa pembaruan state ke dalam satu re-render, yang menghasilkan peningkatan performa yang signifikan. Hal ini sangat relevan dalam aplikasi kompleks dengan perubahan state yang sering terjadi.

Apa itu Batching Otomatis React?

Batching, dalam konteks React, adalah proses mengelompokkan beberapa pembaruan state ke dalam satu pembaruan tunggal. Sebelum React 18, batching hanya diterapkan pada pembaruan yang terjadi di dalam event handler React. Pembaruan di luar event handler, seperti yang ada di dalam setTimeout, promise, atau event handler bawaan (native), tidak di-batch. Hal ini dapat menyebabkan re-render yang tidak perlu dan hambatan performa.

React 18 memperkenalkan batching otomatis, yang memperluas optimisasi ini ke semua pembaruan state, di mana pun itu terjadi. Ini berarti bahwa baik pembaruan state Anda terjadi di dalam event handler React, callback setTimeout, atau resolusi promise, React akan secara otomatis mengelompokkannya menjadi satu re-render tunggal.

Mengapa Batching Otomatis Penting?

Batching otomatis memberikan beberapa manfaat utama:

Bagaimana Cara Kerja Batching Otomatis

React mencapai batching otomatis dengan menunda eksekusi pembaruan state hingga akhir konteks eksekusi saat ini. Ini memungkinkan React untuk mengumpulkan semua pembaruan state yang terjadi selama konteks tersebut dan mengelompokkannya menjadi satu pembaruan tunggal.

Perhatikan contoh sederhana berikut:

function ExampleComponent() {
  const [count1, setCount1] = useState(0);
  const [count2, setCount2] = useState(0);

  function handleClick() {
    setTimeout(() => {
      setCount1(count1 + 1);
      setCount2(count2 + 1);
    }, 0);
  }

  return (
    <div>
      <p>Count 1: {count1}</p>
      <p>Count 2: {count2}</p>
      <button onClick={handleClick}>Increment</button>
    </div>
  );
}

Sebelum React 18, mengklik tombol akan memicu dua re-render: satu untuk setCount1 dan satu lagi untuk setCount2. Dengan batching otomatis di React 18, kedua pembaruan state dikelompokkan bersama, menghasilkan hanya satu re-render.

Contoh Aksi Batching Otomatis

1. Pembaruan Asinkron

Operasi asinkron, seperti mengambil data dari API, sering kali melibatkan pembaruan state setelah operasi selesai. Batching otomatis memastikan bahwa pembaruan state ini dikelompokkan bersama, bahkan jika terjadi di dalam callback asinkron.

function DataFetchingComponent() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    async function fetchData() {
      try {
        const response = await fetch('https://api.example.com/data');
        const jsonData = await response.json();
        setData(jsonData);
        setLoading(false);
      } catch (error) {
        console.error('Gagal mengambil data:', error);
        setLoading(false);
      }
    }

    fetchData();
  }, []);

  if (loading) {
    return <p>Loading...</p>;
  }

  return <div>Data: {JSON.stringify(data)}</div>;
}

Dalam contoh ini, setData dan setLoading keduanya dipanggil di dalam fungsi asinkron fetchData. React akan mengelompokkan pembaruan ini bersama-sama, menghasilkan satu re-render tunggal setelah data diambil dan state loading diperbarui.

2. Promise

Serupa dengan pembaruan asinkron, promise sering kali melibatkan pembaruan state saat promise berhasil (resolve) atau gagal (reject). Batching otomatis memastikan bahwa pembaruan state ini juga dikelompokkan bersama.

function PromiseComponent() {
  const [result, setResult] = useState(null);
  const [error, setError] = useState(null);

  useEffect(() => {
    const myPromise = new Promise((resolve, reject) => {
      setTimeout(() => {
        const success = Math.random() > 0.5;
        if (success) {
          resolve('Promise berhasil diselesaikan!');
        } else {
          reject('Promise ditolak!');
        }
      }, 1000);
    });

    myPromise
      .then((value) => {
        setResult(value);
        setError(null);
      })
      .catch((err) => {
        setError(err);
        setResult(null);
      });
  }, []);

  if (error) {
    return <p>Error: {error}</p>;
  }

  if (result) {
    return <p>Result: {result}</p>;
  }

  return <p>Loading...</p>;
}

Dalam kasus ini, baik setResult dan setError(null) dipanggil saat berhasil, atau setError dan setResult(null) dipanggil saat gagal. Terlepas dari itu, batching otomatis akan menggabungkan ini menjadi satu re-render tunggal.

3. Event Handler Bawaan (Native)

Terkadang, Anda mungkin perlu menggunakan event handler bawaan (misalnya, addEventListener) alih-alih event handler sintetis React. Batching otomatis juga berfungsi dalam kasus ini.

function NativeEventHandlerComponent() {
  const [scrollPosition, setScrollPosition] = useState(0);

  useEffect(() => {
    function handleScroll() {
      setScrollPosition(window.scrollY);
    }

    window.addEventListener('scroll', handleScroll);

    return () => {
      window.removeEventListener('scroll', handleScroll);
    };
  }, []);

  return <p>Scroll Position: {scrollPosition}</p>;
}

Meskipun setScrollPosition dipanggil di dalam event handler bawaan, React akan tetap mengelompokkan pembaruan-pembaruan tersebut, mencegah re-render berlebihan saat pengguna melakukan scroll.

Memilih Keluar dari Batching Otomatis

Dalam kasus yang jarang terjadi, Anda mungkin ingin memilih keluar dari batching otomatis. Misalnya, Anda mungkin ingin memaksakan pembaruan sinkron untuk memastikan UI diperbarui segera. React menyediakan API flushSync untuk tujuan ini.

Catatan: Penggunaan flushSync harus dilakukan dengan hemat, karena dapat berdampak negatif pada performa. Umumnya, lebih baik mengandalkan batching otomatis kapan pun memungkinkan.

import { flushSync } from 'react-dom';

function ExampleComponent() {
  const [count, setCount] = useState(0);

  function handleClick() {
    flushSync(() => {
      setCount(count + 1);
    });
  }

  return (<button onClick={handleClick}>Increment</button>);
}

Dalam contoh ini, flushSync memaksa React untuk segera memperbarui state dan melakukan re-render komponen, melewati batching otomatis.

Praktik Terbaik untuk Mengoptimalkan Pembaruan State

Meskipun batching otomatis memberikan peningkatan performa yang signifikan, tetap penting untuk mengikuti praktik terbaik dalam mengoptimalkan pembaruan state:

Batching Otomatis dan Pertimbangan Global

Batching otomatis, sebagai optimisasi performa inti React, menguntungkan aplikasi secara global terlepas dari lokasi pengguna, kecepatan jaringan, atau perangkat. Namun, dampaknya bisa lebih terasa dalam skenario dengan koneksi internet yang lebih lambat atau perangkat yang kurang bertenaga. Untuk audiens internasional, pertimbangkan poin-poin berikut:

Kesimpulan

Batching otomatis React adalah teknik optimisasi yang kuat yang dapat secara signifikan meningkatkan performa aplikasi React Anda. Dengan secara otomatis mengelompokkan beberapa pembaruan state ke dalam satu re-render, ini mengurangi overhead rendering, mencegah state yang tidak konsisten, dan mengarah pada pengalaman pengguna yang lebih lancar dan responsif. Dengan memahami cara kerja batching otomatis dan mengikuti praktik terbaik untuk mengoptimalkan pembaruan state, Anda dapat membangun aplikasi React berkinerja tinggi yang memberikan pengalaman pengguna yang hebat kepada pengguna di seluruh dunia. Memanfaatkan alat seperti React DevTools membantu untuk lebih menyempurnakan dan mengoptimalkan profil performa aplikasi Anda dalam berbagai pengaturan global.