Pikir Dua Kali Saat Menggunakan Operator '&&' untuk Rendering Bersyarat

SSR vs CSR? Mari temukan pro dan kontra dari setiap motode dan dapatkan informasi untuk membantu Anda memilih strategi rendering yang tepat untuk project Anda berikutnya.

Pikir Dua Kali Saat Menggunakan Operator '&&' untuk Rendering Bersyarat

Operator bersyarat berperan penting dalam pengambilan keputusan dan mengontrol alur eksekusi. Dan salah satu operator yang paling populer dalam Javascript adalah &&. Meskipun terlihat nyaman, operator ini dapat menyebabkan beberapa kesalahan logika.

Mari kita lihat jebakan dalam menggunakan operator && dan jelajahi pendekatan alternatif yang dapat mengurangi potensi masalah.

const Component = (isOpen) => {
  return (
    <div>
      // when isOpen is true show the modal
      {isOpen && <div id="modal">This is a Modal</div>}
    </div>
  );
};

Pada contoh, jika variabel isOpen bernilai true, modal div akan ditampilkan di layar, dan jika bernilai false, modal div tidak akan dirender. Semuanya sudah jelas! Selama isOpen adalah boolean, null, undefined, atau string, tidak ada masalah.

const Component = () => {
  return (
    <div>
      // BOOLEAN
      // modal will be rendered
      {true && <div id="modal">This is a Modal</div>}

      // modal won't be rendered
      {false && <div id="modal">This is a Modal</div>}

      // NULL
      // modal won't be rendered
      {null && <div id="modal">This is a Modal</div>}

      // UNDEFINED
      // modal won't be rendered
      {undefined && <div id="modal">This is a Modal</div>}

      // STRING
      // modal will be rendered
      {"hello" && <div id="modal">This is a Modal</div>}

      // modal won't be rendered
      {"" && <div id="modal">This is a Modal</div>}
    </div>
  );
};

Bagaimana jika kita menggunakan number.

const Component = () => {
  return (
    <div>
      // NUMBER
      // modal will be rendered
      {1 && <div id="modal">This is a Modal</div>}

      // modal will be rendered
      {0 && <div id="modal">This is a Modal</div>}

      // modal will be rendered
      {-0 && <div id="modal">This is a Modal</div>}
      
      // modal will be rendered
      {NaN && <div id="modal">This is a Modal</div>}
    </div>
  );
};

Saya akan memberikan sebuah contoh. Dan Anda dapat melihat masalah dalam contoh tersebut bahkan pada situs web paling populer dari perusahaan terbesar di dunia.

//Let's display the rating on the screen
let rating: data.totalStars / data.starNumber

<div className="stars">
  {Math.round(rating)}
</div>

Anggap saja total bintang yang diberikan untuk produk adalah 100 dengan total 30 orang. Dan kami ingin menunjukkan peringkat rata-rata.

100/30 = 3.333333333333333

dan

Math.round(3.33333) = 3

Namun ketika Anda menambahkan project baru, nilai awal dari totalStars dan starNumber akan menjadi 0.

0/0 = NaN

Saya yakin Anda telah melihat sesuatu seperti di bawah ini ribuan kali!

nan

Solusinya adalah Operator Ternary

Operator ternary menawarkan keserbagunaan dan fleksibilitas yang melampaui kemampuan operator ‘&&’. Dengan menggunakan operator ternary, Anda dapat menangani semua nilai falsy.

const Component = () => {
  return (
    <div>
      // modal won't be rendered
      {0 ? <div id="modal">This is a Modal</div> : null}

      // modal won't be rendered
      {-0 ? <div id="modal">This is a Modal</div> : null}
      
      // modal won't be rendered
      {NaN ? <div id="modal">This is a Modal</div> : null}
    </div>
  );
};

Solusi Lainnya

Anda dapat mengonversi nilai boolean menggunakan konstruktor Boolean() atau Double NOT (!!)

console.log(Boolean(NaN))
//false

console.log(!!NaN)
//false

console.log(Boolean(0))
//false

console.log(!!0)
//false

console.log(Boolean(-0))
//false

console.log(!!-0)
//false