Menu

React'te Koşullu Render: if, Ternary, && ve null

React'te koşullu render düz JavaScript'tir: bir bileşenin hangi JSX'i döndüreceğine bir if deyimi, bir ternary ya da && karar verir. Her kalıbı, &&'nin yazdırabildiği başıboş 0'ı, null döndürmeyi ve bir bileşeni gizlemenin onu render etmemekle neden aynı olmadığını öğren.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

React'te koşullu render, bir bileşenin ne döndüreceğini sıradan JavaScript ile seçmek demektir: return'den önce bir if deyimi, JSX içinde bir ternary cond ? a : b, ya da bir şeyi göstermek veya hiçbir şey göstermemek için cond && <Thing />. Öğrenilecek özel bir şablon sözdizimi yoktur.

Düğmeye tıkla; hem mesaj hem de etiket değişir, çünkü her ternary bir sonraki render'da farklı bir metin seçer. useState(false) ifadesini useState(true) olarak değiştir; önizleme oturum açık olarak başlar.

if deyimleri ve erken return'ler

JSX süslü parantezleri deyim değil ifade kabul eder, bu yüzden işaretlemenin içine {if (x) ...} yazamazsın. return'den önce istediğin her if'i yazabilirsin. Bileşenin bütün bir durumu farklı göründüğünde (yükleniyor, hata, boş), her durum için erken return yap ve ana işaretlemeyi normal durum için sakla.

Her düğme gelen kutusunu farklı bir duruma sokar ve her durumun kendi kısa, okunabilir dalı vardır. Erken return'ler, iç içe yazmadan mutlu yolu en altta tutar.

JSX içinde ternary'ler

İşaretlemenin yalnızca küçük bir kısmı değiştiğinde satır içi bir ternary onu bir arada tutar: {isOpen ? <CloseIcon /> : <MenuIcon />}. Ternary'ler iki seçenek için iyi çalışır. Üç ya da daha fazlası için iç içe ternary'ler hızla okunması zor hâle gelir:

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

Bunu gördüğünde mantığı return'den önce bir if zincirine (yukarıdaki gibi) ya da bir nesne haritasına (aşağıda) taşı.

&& ve başıboş 0

cond && <Thing />, cond truthy olduğunda <Thing />'i, false olduğunda hiçbir şeyi render etmez. Bu, && sol tarafı falsy olduğunda o tarafı döndürdüğü ve React false, null ve undefined için hiçbir şey render etmediği için çalışır.

Tuzak şu: 0 da falsy'dir ve React sayıları render eder. Yani sayı 0 iken count && <Badge /> sayfaya düz bir 0 koyar.

Okunmamış mesaj yokken ilk satır "Broken: 0" der, ikincisi ise "Fixed:" sonrasında hiçbir şey göstermez. New message'a tıkla, ikisi aynı şeyi söyler; Mark all read'e tıkla, 0 geri gelir. Çözüm &&'ye gerçek bir boolean vermektir: unread > 0, items.length > 0 ya da Boolean(unread). Boş bir string '' ilke olarak aynı soruna sahiptir, ama görünür hiçbir şey olarak render edildiği için nadiren fark edersin.

null döndürmek

Bir bileşen hiçbir şey render etmemek için null döndürebilir. Yalnızca uyarılacak bir şey olduğunda görünen bir uyarı bandı buna iyi bir örnektir: ebeveyn her zaman <Warning /> render eder, karar ise bileşenindir.

Konsolu izle: Warning fonksiyonu, null döndürdüğü render'lar dahil her render'da kayıt yazar. null döndürmek işi değil, çıktıyı atlar. Hook'ları ve efektleri yine çalışır, bu yüzden bir bileşen pahalıysa ya da bir şey başlatıyorsa (bir zamanlayıcı, bir abonelik), kararı ebeveynde ver ve onu hiç render etme.

JSX'i bir değişkende saklamak

JSX bir değerdir, bu yüzden onu bir değişkene atayabilir, if deyimleriyle oluşturabilir ve sonra işaretlemeye koyabilirsin. Bu, daha büyük bir yerleşimin bir parçası birkaç koşula bağlı olduğunda işe yarar.

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>
    );
}

Bir nesneyle birkaç bileşen arasından seçim yapmak

Seçim "birçoğundan biri" olduğunda, her değeri bir bileşene eşleyen bir nesne uzun bir if zincirinden ya da bir switch'ten daha kısadır ve bir durum eklemek tek satırdır.

TABS[tab] bir bileşen seçer, <Panel /> da onu render eder. Değişken büyük harfle başlamalıdır: JSX <panel />'i bir HTML etiketi olarak ele alır. TABS'a kendi bileşeniyle bir notifications girişi ekle; dördüncü bir düğme belirir.

Gizlemek, render etmemekle aynı şey değil

Bir şeyi kaybettirmenin iki yolu vardır ve farklı davranırlar. show && <Counter />, show false olduğunda bileşeni ağaçtan kaldırır. React onu unmount eder ve state'ini atar, bu yüzden geri geldiğinde sıfırdan başlar. CSS ile gizlemek (style={{ display: show ? 'block' : 'none' }}) onu mount edilmiş tutar, böylece state'i hayatta kalır.

İki sayaca da birkaç kez tıkla, kutunun işaretini kaldır, sonra yeniden işaretle. İlk sayaç 0'a dönmüştür, ikincisi ise sayısını hâlâ tutar. İkisi de yanlış değil: kaldırmak her seferinde boş başlaması gereken bir form için doğrudur, gizlemek ise kaydırma konumu ya da girdisi korunması gereken sekmeler için doğrudur. Render sayfası React'in bir bileşenin render'lar arasında aynı bileşen olduğuna nasıl karar verdiğini anlatıyor.

React 19.2 üçüncü bir seçenek ekler: <Activity mode="hidden">; çocuklarını gizler ve CSS gibi state'lerini korur, ayrıca yeniden gösterilene kadar efektlerini temizler.

Koşullu props ve özellikler

Koşullar yalnızca hangi öğelerin göründüğüyle ilgili değildir. Her prop hesaplanmış bir değer alabilir, bu yüzden bir özelliğin içindeki bir ternary ya da karşılaştırma çoğu zaman tek ihtiyacındır:

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

Bir prop'un değeri undefined olduğunda React özelliği tamamen dışarıda bırakır; bu, bir özelliği yalnızca bazen eklemenin temiz bir yoludur: title={isTruncated ? fullText : undefined}. disabled ve checked gibi boolean özellikler için true ya da false aktar, React onları ekler ya da kaldırır.

Listelerde koşullar

Öğeleri bir listenin dışında bırakmak için map içinden null döndürmek yerine diziyi map'lemeden önce filtrele. items.filter((i) => i.done).map(...) yaptığı şey gibi okunur ve listeler ve key'ler sayfası bunu çalışan bir örnekte gösteriyor.

Sıkça Sorulan Sorular

JSX içinde if deyimi nasıl yazılır?

JSX süslü parantezlerinin içine bir if deyimi koyamazsın, çünkü süslü parantezler ifade alır. JSX içinde bir ternary (cond ? a : b) ya da && kullan, veya if'i return'den önce çalıştırıp JSX'i bir değişkende sakla.

Bileşenim neden bir 0 gösteriyor?

count && <Badge />, count 0 olduğunda count'un kendisini döndürür ve React 0 sayısını render eder. Sol tarafı gerçek bir boolean yap: count > 0 && <Badge />.

React'te hiçbir şey nasıl render edilmez?

Bileşenden null döndür ya da JSX'e null, undefined, false veya true koy. React bunların hiçbirini render etmez.

null döndüren bir bileşen yine de çalışır mı?

Evet. Fonksiyonu çalışır, hook'ları çalışır ve efektleri tetiklenir. null döndürmek yalnızca sayfaya hiçbir şey eklemediği anlamına gelir. İşi tamamen atlamak için bileşeni ebeveynden render etme.

Bir bileşeni CSS ile mi gizlemeliyim, yoksa kaldırmalı mıyım?

Kaldırmak (show && <Panel />) onu unmount eder, böylece state'i atılır ve bir dahaki sefere sıfırdan başlar. display: none ile gizlemek onu mount edilmiş tutar ve state'ini korur. State'in hayatta kalıp kalmaması gerektiğine göre seç.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA