Mengukur Elemen DOM dengan useLayoutEffect
Baca dimensi, posisi, dan offset gulir elemen setelah tata letak tetapi sebelum pengecatan untuk mencegah kedipan.
Mengukur Elemen DOM dengan useLayoutEffect adalah pelajaran React Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar React Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus React Academy mencakup 4 pelajaran total.
Ikhtisar getBoundingClientRect
element.getBoundingClientRect() mengembalikan objek DOMRect yang berisi ukuran dan posisi elemen relatif terhadap area tampilan: top, right, bottom, left, width, dan height. Fungsi ini memaksa peramban melakukan perhitungan tata letak untuk mengembalikan nilai yang akurat, jadi panggil seperlunya.
Masalah Membaca di useEffect
Jika Anda membaca getBoundingClientRect() di dalam useEffect, peramban sudah selesai menampilkan tampilan. Jika kemudian Anda menetapkan status berdasarkan pengukuran tersebut, React melakukan perenderan ulang dan peramban menggambar ulang. Pengguna mungkin melihat elemen sebentar dalam posisi atau ukuran yang salah sebelum perbaikan muncul pada penggambaran kedua.
Mengapa useLayoutEffect Menyelesaikan Masalah Ini
Membaca pengukuran di dalam useLayoutEffect terjadi setelah mutasi DOM, tetapi sebelum penggambaran. Setiap pembaruan status yang dipicu oleh pengukuran tersebut menyebabkan React melakukan perenderan ulang secara sinkron dan menerapkan DOM yang telah diperbaiki—semuanya sebelum peramban menampilkan apa pun. Pengguna hanya melihat hasil akhir yang benar dalam satu siklus penggambaran.
Penempatan Gelembung Informasi
Gelembung informasi perlu muncul di dekat elemen pemicunya. Ukur posisi elemen pemicu di dalam useLayoutEffect menggunakan getBoundingClientRect(), hitung posisi mutlak gelembung informasi, lalu tetapkan posisi tersebut dalam status. Gelembung informasi dirender di lokasi yang benar pada tampilan pertama, tanpa lompatan yang terlihat dari posisi awal yang salah.
Animasi Elemen: Membaca Ukuran Awal
Untuk menganimasikan elemen dari ukuran alaminya (tanpa batasan) ke ukuran tetap, Anda perlu mengetahui ukuran alaminya sebelum menerapkan batasan tersebut. Baca tinggi elemen di dalam useLayoutEffect sebelum gaya animasi apa pun diterapkan, simpan dalam status, lalu gunakan sebagai nilai bingkai kunci awal untuk transisi CSS.
Tinggi Tajuk yang Melekat
Ketika halaman memiliki tajuk yang melekat, isi halaman memerlukan ruang dalam atas yang sama dengan tinggi tajuk agar tidak tersembunyi di belakangnya. Ukur tinggi tajuk di dalam useLayoutEffect menggunakan referensi: headerRef.current.getBoundingClientRect().height. Tetapkan nilai ini sebagai paddingTop pada wadah isi. Tata letak sudah benar sejak perenderan pertama.
Pembaruan Status Menyebabkan Perenderan Ulang Sinkron
Ketika Anda memanggil setState di dalam useLayoutEffect, React segera menjalankan siklus perenderan dan penerapan lainnya dalam blok sinkron yang sama. Perenderan ulang ini juga menjalankan useLayoutEffect. Berhati-hatilah agar tidak membuat perulangan tanpa akhir: perbarui status hanya jika pengukuran baru berbeda dari nilai status saat ini.
SSR: Pengukuran Mengembalikan Nol
Di server, elemen DOM tidak ada, sehingga getBoundingClientRect() akan menghasilkan kesalahan atau mengembalikan nol. Lindungi useLayoutEffect dengan pemeriksaan: if (typeof window === 'undefined') return;. Untuk aplikasi SSR, Anda mungkin perlu melakukan hidrasi dengan ukuran pengganti, lalu mengukur setelah hidrasi selesai di sisi klien.
ResizeObserver untuk Pelacakan Berkelanjutan
Pengukuran satu kali dengan useLayoutEffect memberi Anda ukuran pada saat pemasangan. Untuk melacak perubahan ukuran saat elemen diubah ukurannya (akibat perubahan ukuran jendela, isi dinamis, atau perubahan CSS), gunakan ResizeObserver. Fungsi ini menjalankan panggilan balik setiap kali ukuran elemen berubah, sehingga lebih cocok untuk komponen responsif.
Menghindari Pengukuran Berulang
Jika beberapa efek memerlukan pengukuran yang sama, hitung sekali lalu bagikan melalui konteks atau dengan meneruskannya sebagai properti. Menghitung nilai getBoundingClientRect() yang sama dalam beberapa pemanggilan useLayoutEffect memicu beberapa pembacaan tata letak sinkron, yang masing-masing relatif mahal. Gabungkan pengukuran jika memungkinkan.
Waktu Referensi dengan useLayoutEffect
Referensi diisi sebelum efek berjalan. Saat useLayoutEffect dijalankan, ref.current dijamin menunjuk ke elemen DOM. Inilah alasan pola tersebut berfungsi: useLayoutEffect(() => { const rect = ref.current.getBoundingClientRect(); ... }, []). Referensi tidak pernah bernilai null di dalam efek tata letak pada komponen yang telah dipasang.
Waktu getBoundingClientRect
Mengapa lebih baik memanggil getBoundingClientRect() di dalam useLayoutEffect daripada di dalam useEffect?
Ringkasan Pelajaran: Mengukur Elemen DOM
Gunakan getBoundingClientRect() di dalam useLayoutEffect untuk membaca pengukuran DOM setelah mutasi, tetapi sebelum penggambaran. Pembaruan status dari pengukuran ini menyebabkan perenderan ulang sinkron yang disertakan dalam penggambaran yang sama, sehingga mencegah kedipan. Lindungi dari SSR dengan pemeriksaan typeof window. Untuk pelacakan ukuran berkelanjutan, utamakan ResizeObserver.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengukur Elemen DOM dengan useLayoutEffect” gratis?
Ya — teks lengkap “Mengukur Elemen DOM dengan useLayoutEffect” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus React Academy, upgrade ke CoddyKit PRO. Kursus React Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengukur Elemen DOM dengan useLayoutEffect”?
Baca dimensi, posisi, dan offset gulir elemen setelah tata letak tetapi sebelum pengecatan untuk mencegah kedipan. Kamu berlatih React Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai React Academy?
Tidak diperlukan pengalaman sebelumnya. React Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Mengukur Elemen DOM dengan useLayoutEffect” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran React Academy ini?
Ya. Setiap pelajaran React Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Fase Rendering dan Commit DOM
- Kapan useLayoutEffect Berjalan dibandingkan useEffect
- Mengukur Elemen DOM dengan useLayoutEffect
- Menghindari Beban Tata Letak dan Kedipan Visual