JSX'te If Kullanımı

JSX'te If Kullanımı ve Alternatif Çözümler

JSX içerisinde süslü parantez {} kullanarak JavaScript ifadelerini yazabiliriz. Ancak, JavaScript ifadeleri (expressions) ile JavaScript deyimlerini (statements) karıştırmamak gerekir. JSX içinde sadece ifadeleri kullanabiliriz, fakat if bir ifade değil, bir deyimdir. Bu yüzden doğrudan JSX içinde if kullanamayız.

Yanlış bir kullanım örneği:

function Friend({ name, isOnline }) {
  return (
    <li className="friend">
      {if (isOnline) {
        <div className="green-dot" />
      }}
      {name}
    </li>
  );
}

Bu kod çalışmaz çünkü if deyimi JSX içinde doğrudan kullanılamaz. Peki, neden? JavaScript'e çevirdiğimizde şu hale gelir:

function Friend({ name, isOnline }) {
  return React.createElement(
    'li',
    { className: 'friend' },
    if (isOnline) {
      React.createElement('div', { className: 'green-dot' });
    },
    name
  );
}

Yukarıdaki kod React.createElement çağrısının ortasında bir if bloğu içeriyor. Ancak, JavaScript’te bir fonksiyon çağrısı içinde if bloğu kullanamayız. Basit bir örnekle bunu açıklayalım:

console.log(
  if (isLoggedIn) {
    "Giriş yapıldı!"
  } else {
    "Giriş yapılmadı."
  }
);

Bu kod çalışmaz çünkü if bir deyimdir ve doğrudan bir fonksiyon çağrısında kullanılamaz. Peki, JSX içerisinde if kullanmak istersek ne yapabiliriz?

Çözüm: JSX Dışında If Kullanımı

JSX içinde doğrudan if kullanamasak da, onu JSX'in dışında bir değişkene atayarak kullanabiliriz.

Örnek:

App.js

import Friend from './Friend';

function App() {
  return (
    <ul className='friend-list'>
      <Friend name='Andrew' isOnline={false} />
      <Friend name='Beatrice' isOnline={true} />
      <Friend name='Chen' isOnline={true} />
    </ul>
  );
}

export default App;

Friend.js

function Friend({ name, isOnline }) {
  let prefix;

  if (isOnline) {
    prefix = <div className='green-dot' />;
  }

  return (
    <li className='friend'>
      {prefix}
      {name}
    </li>
  );
}

export default Friend;

JSX İçinde Alternatif Yöntemler

JSX içinde if kullanamasak da, alternatif yöntemlerle aynı mantığı uygulayabiliriz.

1. Ternary (Üçlü) Operatörü Kullanımı

Ternary operatörü (? :), JSX içinde koşullu içerik göstermek için oldukça kullanışlıdır.

function Friend({ name, isOnline }) {
  return (
    <li className='friend'>
      {isOnline ? <div className='green-dot' /> : null}
      {name}
    </li>
  );
}

2. Mantıksal && Operatörü Kullanımı

Eğer yalnızca koşul doğru olduğunda bir öğe göstermek istiyorsak, && operatörünü kullanabiliriz.

function Friend({ name, isOnline }) {
  return (
    <li className='friend'>
      {isOnline && <div className='green-dot' />}
      {name}
    </li>
  );
}

undefined Değerlerin React Davranışı

Bazı durumlarda, değişkenlere değer atamazsak ne olur? Örneğin:

function Greeting() {
  let someClass;

  return <div className={someClass}>Hello World</div>;
}

Bu kodun ürettiği HTML şu şekildedir:

<div>Hello World</div>

Burada, someClass değişkenine herhangi bir değer atanmamıştır, dolayısıyla React bu değişkeni undefined olarak kabul eder ve DOM'a hiç eklemez. Yani, className="" gibi boş bir değer vermez, tamamen yok sayar.

Bu davranış, undefined, null ve false gibi bazı falsy değerler için geçerlidir.

Özet

Bu yöntemlerle JSX içinde koşullu içerikler oluşturabilir ve daha temiz, okunabilir kod yazabilirsiniz!