Menu

Conditional Rendering React: if, Ternary, && dan null

Conditional rendering di React hanyalah JavaScript biasa: pernyataan if, ternary, atau && menentukan JSX mana yang dikembalikan komponen. Pelajari setiap polanya, angka 0 nyasar yang bisa dicetak &&, mengembalikan null, dan kenapa menyembunyikan komponen tidak sama dengan tidak merendernya.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Conditional rendering di React berarti memilih apa yang dikembalikan sebuah komponen dengan JavaScript biasa: pernyataan if sebelum return, ternary cond ? a : b di dalam JSX, atau cond && <Thing /> untuk menampilkan sesuatu atau tidak sama sekali. Tidak ada sintaks template khusus yang perlu dipelajari.

Klik tombolnya, dan pesan maupun label-nya berganti, karena setiap ternary memilih string yang berbeda di render berikutnya. Ganti useState(false) menjadi useState(true), dan pratinjau dimulai dalam keadaan sudah login.

Pernyataan if dan early return

Kurung kurawal JSX menerima ekspresi, bukan pernyataan, jadi kamu tidak bisa menulis {if (x) ...} di dalam markup. Kamu bisa menulis if apa pun sebelum return. Saat seluruh tampilan komponen berbeda untuk suatu keadaan (loading, error, kosong), lakukan early return untuk setiap kasus dan simpan markup utama untuk keadaan normal.

Setiap tombol membawa inbox ke keadaan yang berbeda, dan setiap keadaan punya cabangnya sendiri yang pendek dan mudah dibaca. Early return menjaga jalur normal tetap di bagian bawah tanpa nesting.

Ternary di dalam JSX

Saat hanya sebagian kecil markup yang berubah, ternary inline menjaganya tetap menyatu: {isOpen ? <CloseIcon /> : <MenuIcon />}. Ternary cocok untuk dua pilihan. Ternary bersarang untuk tiga pilihan atau lebih cepat menjadi sulit dibaca:

// Hard to follow
{status === 'loading' ? <Spinner /> : status === 'error' ? <ErrorBox /> : <List />}

Saat kamu melihat pola seperti itu, pindahkan logikanya ke rangkaian if sebelum return (seperti di atas) atau ke peta objek (di bagian bawah).

&& dan angka 0 yang nyasar

cond && <Thing /> merender <Thing /> saat cond bernilai truthy dan tidak merender apa pun saat nilainya false. Ini berjalan karena && mengembalikan sisi kirinya saat sisi itu falsy, dan React tidak merender apa pun untuk false, null, dan undefined.

Jebakannya, 0 juga falsy, dan React tetap merender angka. Jadi count && <Badge /> dengan count 0 menaruh angka 0 apa adanya di halaman.

Saat tidak ada pesan yang belum dibaca, baris pertama berbunyi "Broken: 0", sedangkan baris kedua tidak menampilkan apa pun setelah "Fixed:". Klik New message, dan keduanya sama; klik Mark all read, dan 0 itu muncul lagi. Solusinya adalah memberi && boolean sungguhan: unread > 0, items.length > 0, atau Boolean(unread). String kosong '' sebenarnya punya masalah yang sama, tetapi ia dirender sebagai sesuatu yang tidak terlihat, jadi jarang kamu sadari.

Mengembalikan null

Sebuah komponen bisa mengembalikan null untuk tidak merender apa pun. Banner peringatan yang hanya muncul saat ada sesuatu yang perlu diperingatkan adalah contoh yang pas: induknya selalu merender <Warning />, dan komponen itu yang memutuskan.

Perhatikan konsolnya: fungsi Warning mencatat log di setiap render, termasuk saat ia mengembalikan null. Mengembalikan null melewatkan output-nya, bukan pekerjaannya. Hook dan effect-nya tetap berjalan, jadi jika sebuah komponen berat atau memulai sesuatu (timer, subscription), putuskan di induknya dan jangan render komponen itu sama sekali.

Menyimpan JSX di variabel

JSX adalah nilai, jadi kamu bisa menyimpannya di variabel, menyusunnya dengan pernyataan if, dan menaruhnya di markup belakangan. Ini membantu saat satu bagian dari layout yang lebih besar bergantung pada beberapa kondisi.

function Checkout({ cart, user }) {
    let action;
    if (!user) {
        action = <a href="/login">Log in to check out</a>;
    } else if (cart.length === 0) {
        action = <p>Your cart is empty.</p>;
    } else {
        action = <button>Pay now</button>;
    }

    return (
        <section>
            <h2>Your cart</h2>
            {action}
        </section>
    );
}

Memilih di antara beberapa komponen dengan objek

Saat pilihannya adalah "salah satu dari banyak", objek yang memetakan setiap nilai ke sebuah komponen lebih ringkas daripada rangkaian if yang panjang atau switch, dan menambah satu kasus cukup satu baris.

TABS[tab] memilih sebuah komponen, dan <Panel /> merendernya. Variabelnya harus diawali huruf kapital: JSX menganggap <panel /> sebagai tag HTML. Tambahkan entri notifications ke TABS dengan komponennya sendiri, dan tombol keempat akan muncul.

Menyembunyikan tidak sama dengan tidak merender

Ada dua cara membuat sesuatu menghilang, dan perilakunya berbeda. show && <Counter /> menghapus komponen dari tree saat show bernilai false. React membuatnya unmount dan membuang state-nya, jadi komponen itu mulai dari awal saat muncul lagi. Menyembunyikannya dengan CSS (style={{ display: show ? 'block' : 'none' }}) membuatnya tetap mount, jadi state-nya bertahan.

Klik kedua counter beberapa kali, hilangkan centang pada kotaknya, lalu centang lagi. Counter pertama kembali ke 0, sedangkan counter kedua masih menyimpan angkanya. Tidak ada yang salah: menghapus tepat untuk form yang harus kosong setiap kali dibuka, menyembunyikan tepat untuk tab yang posisi scroll atau input-nya perlu disimpan. Halaman tentang rendering menjelaskan bagaimana React memutuskan bahwa sebuah komponen adalah komponen yang sama di antara render.

React 19.2 menambahkan pilihan ketiga, <Activity mode="hidden">, yang menyembunyikan child-nya dan mempertahankan state-nya seperti CSS, sekaligus membersihkan effect-nya sampai ditampilkan lagi.

Props dan atribut bersyarat

Kondisi tidak hanya soal elemen mana yang muncul. Prop apa pun bisa menerima nilai hasil perhitungan, jadi ternary atau perbandingan di dalam atribut sering kali sudah cukup:

<button disabled={!canSave} className={hasError ? 'field error' : 'field'}>
    Save
</button>
<input aria-invalid={hasError} placeholder={user ? user.email : 'you@example.com'} />

Saat nilai sebuah prop adalah undefined, React tidak menyertakan atribut itu sama sekali, cara yang rapi untuk menambahkan atribut hanya sesekali: title={isTruncated ? fullText : undefined}. Untuk atribut boolean seperti disabled dan checked, kirim true atau false, dan React akan menambahkan atau menghapusnya.

Kondisi di dalam list

Untuk mengecualikan item dari sebuah list, filter array-nya sebelum melakukan map, alih-alih mengembalikan null dari dalam map. items.filter((i) => i.done).map(...) terbaca sesuai apa yang dilakukannya, dan halaman list dan key menunjukkannya dalam contoh yang bisa dijalankan.

Pertanyaan yang sering diajukan

Bagaimana cara menulis pernyataan if di dalam JSX?

Kamu tidak bisa menaruh pernyataan if di dalam kurung kurawal JSX, karena kurung kurawal hanya menerima ekspresi. Pakai ternary (cond ? a : b) atau && di dalam JSX, atau jalankan if sebelum return dan simpan JSX-nya di variabel.

Kenapa komponen saya menampilkan angka 0?

count && <Badge /> mengembalikan count itu sendiri saat nilainya 0, dan React merender angka 0. Jadikan sisi kirinya boolean sungguhan: count > 0 && <Badge />.

Bagaimana cara tidak merender apa pun di React?

Kembalikan null dari komponen, atau taruh null, undefined, false, atau true di JSX. React tidak merender satu pun dari nilai itu.

Apakah komponen yang mengembalikan null tetap berjalan?

Ya. Fungsinya berjalan, hook-nya berjalan, dan effect-nya tetap terpicu. Mengembalikan null hanya berarti komponen itu tidak menambahkan apa pun ke halaman. Untuk melewatkan pekerjaannya sama sekali, jangan render komponen itu dari induknya.

Sebaiknya komponen disembunyikan dengan CSS atau dihapus?

Menghapusnya (show && <Panel />) membuatnya unmount, jadi state-nya dibuang dan dimulai dari awal lagi di kesempatan berikutnya. Menyembunyikannya dengan display: none membuatnya tetap mount dan state-nya tetap ada. Pilih berdasarkan apakah state itu perlu bertahan.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai