JSX di ReactJS

JSX, singkatan dari JavaScript XML, adalah ekstensi sintaksis yang digunakan dalam React untuk mendefinisikan tampilan komponen. Ini memungkinkan kita untuk menulis kode HTML-like di dalam JavaScript, membuatnya lebih mudah untuk membuat dan mengelola struktur tampilan aplikasi web. Di bawah ini adalah penjelasan lebih lanjut tentang JSX dan mengapa penting dalam pengembangan aplikasi web dengan React:

1. Penyatuan JavaScript dan HTML

JSX memungkinkan kita untuk menuliskan kode HTML langsung di dalam JavaScript, tanpa perlu memisahkan markup dan logika aplikasi. Ini membuat kode menjadi lebih terstruktur dan mudah dipahami, karena kita dapat melihat komponen dan tampilan mereka dalam satu file.

2. Kode yang Lebih Ekspresif

Dengan JSX, kita dapat menggunakan ekspresi JavaScript di dalam kode HTML untuk membuat tampilan yang dinamis dan responsif. Misalnya, kita dapat menyisipkan variabel, pernyataan kondisional, atau perulangan langsung ke dalam markup, memungkinkan kita untuk membuat tampilan yang berubah berdasarkan data atau kondisi tertentu.

3. Pembacaan Kode yang Lebih Mudah

Dibandingkan dengan pendekatan lain seperti menggunakan fungsi createElement secara langsung, JSX membuat kode lebih mudah dibaca dan ditulis. Ini memungkinkan pengembang untuk fokus pada logika aplikasi tanpa harus khawatir tentang menulis kode HTML secara manual.

4. Integrasi dengan Alat Pendukung

JSX bekerja dengan baik dengan alat-alat pengembangan modern seperti linter dan prettier, yang dapat membantu meningkatkan kualitas kode dan konsistensi dalam proyek. Selain itu, JSX juga kompatibel dengan sebagian besar code editor dan alat pengembangan, memungkinkan pengembang untuk memiliki pengalaman pengembangan yang lebih baik.

5. Kompatibilitas dengan Ecosystem React

React adalah salah satu library JavaScript paling populer untuk pengembangan aplikasi web modern. JSX adalah bagian integral dari ekosistem React, dan hampir semua komponen dan tutorial dalam komunitas React menggunakan JSX untuk mendefinisikan tampilan.

Dengan demikian, JSX adalah elemen kunci dalam pengembangan aplikasi web dengan React. Penggunaannya yang mudah dipahami, ekspresif, dan terintegrasi dengan baik dengan alat-alat modern membuatnya menjadi pilihan yang populer bagi pengembang untuk membangun tampilan yang dinamis dan menarik dalam aplikasi web mereka.

Perbedaan sintaks JSX dan HTML

Meskipun JSX dan HTML memiliki kesamaan dalam struktur dan penampilan, ada beberapa perbedaan penting dalam sintaksis di antara keduanya:

  1. Penulisan Tag dan Atribut: Dalam HTML, tag ditulis dalam format <tag> atau <tag atribut="nilai">, sedangkan dalam JSX, tag juga ditulis dalam format yang serupa, tetapi bisa di dalam kurung kurawal {} jika perlu menggunakan ekspresi JavaScript di dalamnya.

    Contoh HTML:

     <div class="container">
       <h1>Hello, World!</h1>
     </div>
    

    Contoh JSX:

     <div className="container">
       <h1>Hello, World!</h1>
     </div>
    
  2. Penggunaan Atribut: Dalam HTML, nilai atribut didefinisikan dalam tanda kutip (baik tunggal atau ganda), sedangkan dalam JSX, nilai atribut JavaScript ditulis dalam kurung kurawal {}.

    Contoh HTML:

     <input type="text" placeholder="Enter your name">
    

    Contoh JSX:

     <input type="text" placeholder={"Enter your name"} />
    
  3. Penulisan Class dan Style: Dalam HTML, atribut kelas ditulis sebagai class, sedangkan dalam JSX, atribut kelas ditulis sebagai className. Penggunaan properti style juga berbeda, dalam HTML menggunakan atribut style, sementara dalam JSX properti style dituliskan sebagai objek JavaScript.

    Contoh HTML:

     <div class="container" style="background-color: blue; color: white;"></div>
    

    Contoh JSX:

     <div className="container" style={{backgroundColor: 'blue', color: 'white'}}></div>
    
  4. Penggunaan Komponen JavaScript: Dalam JSX, komponen JavaScript ditulis sebagai elemen, sedangkan dalam HTML, hanya elemen HTML bawaan yang dapat digunakan.

    Contoh JSX:

     <MyComponent />
    

    Di mana MyComponent adalah komponen JavaScript yang didefinisikan di dalam aplikasi React.

  5. Penutup Tag: Dalam HTML, beberapa tag memerlukan penutupan (</tag>), sementara dalam JSX, tag yang tidak memiliki konten dapat ditutup secara langsung dengan tanda />.

    Contoh HTML:

     <img src="image.jpg" alt="Image">
    

    Contoh JSX::

     <img src="image.jpg" alt="Image" />
    

    Meskipun ada perbedaan ini, konsep dasar dari JSX dan HTML sangat mirip, yang membuatnya mudah bagi pengembang web untuk beralih antara keduanya.

Persamaan JSX dan HTML

Terdapat beberapa persamaan antara JSX (JavaScript XML) dan HTML, karena JSX sebagian besar merupakan ekstensi sintaksis dari HTML yang digunakan dalam lingkungan JavaScript (terutama dalam kerangka kerja React). Berikut ini beberapa persamaan antara keduanya:

  1. Struktur Dasar: Baik JSX maupun HTML menggunakan struktur dasar yang mirip, yaitu dengan menggunakan elemen, atribut, dan konten di dalamnya.

    Contoh JSX :

     // JSX
     <div className="container">
       <h1>Hello, World!</h1>
     </div>
    

    Contoh HTML

     <!-- HTML -->
     <div class="container">
       <h1>Hello, World!</h1>
     </div>
    
  2. Penggunaan Elemen: Baik dalam JSX maupun HTML, kita menggunakan elemen seperti <div>, <h1>, <p>, <input>, dll., untuk menampilkan konten di halaman web.

  3. Atribut: Baik JSX maupun HTML menggunakan atribut untuk menambahkan properti atau karakteristik tertentu ke elemen.

    Contoh JSX:

     // JSX
     <input type="text" placeholder="Enter your name" />
    

    Contoh HTML:

     <!-- HTML -->
     <input type="text" placeholder="Enter your name">
    
  4. Penyusunan: Kedua JSX dan HTML memiliki kemampuan untuk disusun dalam struktur yang bersarang (nested), yang memungkinkan untuk membuat tampilan yang lebih kompleks.

    Contoh JSX:

     // JSX
     <div>
       <h1>Title</h1>
       <p>Paragraph</p>
     </div>
    

    Contoh HTML:

     <!-- HTML -->
     <div>
       <h1>Title</h1>
       <p>Paragraph</p>
     </div>
    

    Meskipun ada beberapa perbedaan dalam sintaksis dan penggunaan fitur khusus, persamaan-persamaan di atas membuatnya relatif mudah bagi pengembang web untuk berpindah antara JSX dan HTML.

Penggunaan Variabel dan Ekspresi di JSX

Pertama-tama, mari kita lihat bagaimana variabel JavaScript dapat digunakan dalam JSX. Variabel dapat digunakan untuk menyimpan nilai yang ingin kita tampilkan atau manipulasi dalam komponen React.

import React from 'react';
import './App.css';

function App() {
  const greeting = 'Hello, World!';
  const name = 'John Doe';

  return (
    <div>
      <h1>{greeting}</h1>
      <p>Welcome, {name}!</p>
    </div>
  );
}

export default App;

Pada contoh di atas, kita mendefinisikan dua variabel, greeting dan name, yang kemudian digunakan di dalam elemen JSX. Variabel-variabel ini diapit oleh kurung kurawal {} untuk mengekspresikan bahwa kita ingin menampilkan nilai variabel tersebut di dalam elemen JSX.

Selain variabel, kita juga dapat menggunakan ekspresi JavaScript di dalam JSX. Ekspresi ini dapat berupa operasi matematika, pemanggilan fungsi, atau bahkan ekspresi kondisional.

import React from 'react';
import './App.css';

function App() {
  const x = 10;
  const y = 5;

  return (
    <div>
      <p>Sum of {x} and {y} is {x + y}.</p>
      <p>{x > y ? 'x is greater than y' : 'y is greater than or equal to x'}</p>
    </div>
  );
}

export default App;

Pada contoh di atas, kita menggunakan ekspresi x + y untuk menampilkan hasil penjumlahan variabel x dan y. Selain itu, kita juga menggunakan ekspresi kondisional (x > y ? ... : ...) untuk menampilkan teks yang sesuai berdasarkan kondisi perbandingan nilai x dan y.

Penggunaan Props dalam JSX

Props adalah objek JavaScript yang berisi data yang dikirim dari satu komponen ke komponen lainnya. Data ini bisa berupa nilai primitif seperti string atau angka, objek, atau bahkan fungsi. Props digunakan untuk memberikan nilai kepada komponen, sehingga komponen dapat diatur dengan berbagai cara berdasarkan nilai-nilai tersebut. Langsung ke praktik nya, pertama kalian buat 2 file jsx seperti berikut:

Untuk mengirim props dari komponen induk ke komponen anak, kita dapat menambahkan atribut props ke elemen komponen saat di-render. Misalnya:

// Komponen Induk
import React from 'react';
import ChildComponent from './ChildComponent';

function ParentComponent() {
  return (
    <div>
      <ChildComponent name="Muhammad Syaifullah Al Arief" age={22} />
    </div>
  );
}

export default ParentComponent;

Dalam contoh di atas, kita mengirimkan dua props ke komponen ChildComponent: name dengan nilai "John" (string) dan age dengan nilai 30 (angka).

Untuk menerima dan menggunakan props di dalam komponen anak, kita dapat mengakses props tersebut sebagai parameter dari fungsi komponen. Misalnya:

// Komponen Anak
import React from 'react';

function ChildComponent(props) {
  return (
    <div>
      <p>Name: {props.name}</p>
      <p>Age: {props.age}</p>
    </div>
  );
}

export default ChildComponent;

alam contoh di atas, kita menggunakan props name dan age di dalam komponen ChildComponent dengan mengaksesnya melalui objek props.

Selain mengakses props secara langsung melalui objek props, kita juga dapat menggunakan destructuring untuk mengekstrak nilai props ke dalam variabel terpisah. Misalnya:

// Komponen Anak dengan Destructuring Props
import React from 'react';

function ChildComponent({ name, age }) {
  return (
    <div>
      <p>Name: {name}</p>
      <p>Age: {age}</p>
    </div>
  );
}

export default ChildComponent;

Dengan menggunakan destructuring, kita dapat mengakses nilai props secara langsung tanpa harus menggunakan objek props.

selanjutnya kita dapat menambahkan Proptypes agar dapat memvalidasi props yang diteruskan ke ChildComponent. Berikut adalah code yang telah ditambahkan proptypes di ChildComponent :

import React from 'react'
import PropTypes from 'prop-types';

function ChildComponent({name, age}) {
  return (
    <div>
      <p>Name: {name}</p>
      <p>Age: {age}</p>
    </div>
  );
}

ChildComponent.propTypes = {
  name: PropTypes.string.isRequired,
  age: PropTypes.number.isRequired,
};

export default ChildComponent;

untuk melihat hasilnya pada App.jsx bisa diubah seperti ini :

import React from 'react';
import './App.css';
import ParentComponent from './components/ParentComponent';

function App() {

  return (
    <ParentComponent />
  );
}

export default App;

Conditional Rendering dalam JSX

Kondisional rendering adalah teknik yang memungkinkan kita untuk menampilkan elemen atau komponen berdasarkan kondisi tertentu. Ini berarti kita dapat mengontrol apakah suatu elemen atau komponen akan ditampilkan atau disembunyikan berdasarkan nilai dari ekspresi kondisional yang dievaluasi.

Mari kita lihat contoh bagaimana kita dapat menggunakan kondisional rendering dalam proyek ReactJS dengan JSX. Untuk tujuan demonstrasi, kita akan membuat sebuah komponen sederhana yang menampilkan pesan "Selamat datang!" jika pengguna telah login, dan menampilkan tombol "Login" jika pengguna belum login.

pertama kita buat dulu file LoginComponent.jsx dan isi seperti berikut :

import React, { useState } from 'react';

export default function LoginComponent() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  function handleLogin() {
    setIsLoggedIn(true);
  }

  function handleLogout() {
    setIsLoggedIn(false);
  }
  return (
    <div>
      {isLoggedIn ? (
        <div>
          <h1>Selamat datang!</h1>
          <button type='button' onClick={handleLogout}>Logout</button>
        </div>
      ) : (
        <div>
          <h1>Silakan login</h1>
          <button type='button' onClick={handleLogin}>Login</button>
        </div>
      )}
    </div>
  );
}

Penjelasan:

  • kita menggunakan useState hook untuk membuat state isLoggedIn yang awalnya disetel ke false.

  • kita mendefinisikan fungsi handleLogin dan handleLogout untuk mengubah nilai isLoggedIn.

  • kita menggunakan kondisional rendering untuk menampilkan pesan dan tombol berdasarkan nilai isLoggedIn. Jika pengguna telah login (isLoggedIn adalah true), kita menampilkan pesan "Selamat datang!" dan tombol "Logout". Jika tidak, kita menampilkan pesan "Silakan login" dan tombol "Login".

untuk melihat hasilnya bisa ubah App.jsx menjadi seperti berikut:

import React from 'react';
import './App.css';
import LoginComponent from './components/LoginComponent';

function App() {

  return (
    <LoginComponent />
  );
}

export default App;

untuk tutorial selanjutnya kita dapat melihat hasilnya dengan mengubah component yang akan ditampilkan di App.jsx seperti kode diatas.

Logical operator && dalam kondisional rendering
Tutorial kedua menggunakan logical operator dalam kondisional rendering di ReactJS dengan sebuah proyek sederhana yang menampilkan informasi produk, pertama buat file ProductComponent.jsx dan isi file seperti berikut :

import React, { useState } from 'react'

function ProductComponent() {
    const [products, setProducts] = useState([
    { id: 1, name: 'Produk A', price: 100, stock: 5 },
    { id: 2, name: 'Produk B', price: 150, stock: 0 },
    { id: 3, name: 'Produk C', price: 200, stock: 10 },
  ]);
  function addStock(id) {
    setProducts((prevProducts) =>
      prevProducts.map((product) =>
        product.id === id ? { ...product, stock: product.stock + 1 } : product
      )
    );
  }
  return (
    <div>
      <h1>Daftar Produk</h1>
      <ul>
        {products.map((product) => (
          <li key={product.id}>
            <span>{product.name}</span>
            {product.stock > 0 && <span>| - Harga: ${product.price}</span>}
            {!product.stock && <span> || - Stok Habis </span>}
            {product.stock > 0 && <span> || stock: {product.stock} </span>}
            <button type='button' onClick={() => addStock(product.id)}>Tambah Stok</button>
          </li>
        ))}
      </ul>
    </div>
  );
}

export default ProductComponent

Di dalam komponen ini, kita menggunakan useState hook untuk membuat state products, yang berisi daftar produk dengan nilai awal yang diberikan. Setiap produk memiliki properti id, name, price, dan stock.

Kemudian, kita mendefinisikan fungsi addStock(id) yang akan menambah stok produk tertentu berdasarkan id yang diberikan. Fungsi ini menggunakan setProducts untuk memperbarui state products. Kita menggunakan map untuk mengubah nilai stok produk yang sesuai dengan id yang diberikan.

Di dalam fungsi return, kita merender elemen-elemen HTML yang menampilkan daftar produk. Kita menggunakan map untuk melakukan iterasi melalui array products dan merender setiap produk dalam bentuk elemen <li>. Untuk setiap produk, kita menampilkan nama produk, harga jika stoknya tersedia, pesan "Stok Habis" jika stoknya habis, jumlah stok produk jika stoknya tersedia, dan tombol "Tambah Stok" yang memanggil fungsi addStock ketika diklik.

Pada akhirnya, kita mengekspor ProductComponent sehingga komponen ini dapat digunakan di tempat lain dalam aplikasi React.

List dan Key dalam JSX

List dalam JSX mengacu pada proses merender daftar elemen dalam bentuk array atau iterable. Kita dapat menggunakan metode map() untuk mengiterasi setiap elemen dalam array dan mengembalikan elemen JSX untuk setiap item. Ini memungkinkan kita untuk membuat tampilan dinamis yang tergantung pada data.

Key adalah atribut khusus yang digunakan oleh React untuk membantu dalam proses reconcilation, yaitu proses untuk mencocokkan elemen yang dihasilkan dengan elemen yang ada di DOM. Key memberikan identifikasi unik pada setiap elemen dalam daftar, sehingga React dapat mengoptimalkan kinerja pembaruan tampilan.

untuk praktiknya kita dapat membuat file TodoComponent.jsx, kemudian isi dengan kode seperti berikut :

import React from 'react';

export default function TodoComponent() {
  const todoItems = [
    { id: 1, text: 'Learn React' },
    { id: 2, text: 'Build a project' },
    { id: 3, text: 'Deploy to production' },
  ];
  return (
    <div>
        <h1>Todo Component</h1>
      <ul>
        {todoItems.map((item) => (
          <li key={item.id}>{item.text}</li>
        ))}
      </ul>
    </div>
  );
}

Kode di atas memungkinkan kita untuk menampilkan daftar todo dalam halaman web menggunakan data yang tersimpan dalam array todoItems. Pertama, kita menyiapkan data todo dalam bentuk array objek dengan setiap objek menyimpan informasi tentang todo, seperti ID dan teksnya.

Kemudian, kita menggunakan metode map() untuk mengambil setiap objek todo dari array todoItems dan merendernya sebagai elemen <li> dalam sebuah unordered list (<ul>). Setiap todo direpresentasikan sebagai sebuah elemen dalam list, dengan teks todo ditampilkan di dalamnya.

Penting untuk memberikan properti key pada setiap elemen <li>, yang diambil dari properti id di setiap objek todo. Ini membantu React dalam mengidentifikasi setiap elemen secara unik dan memastikan pengoptimalan kinerja saat melakukan pembaruan tampilan.

Dengan demikian, dengan menggunakan kode ini, kita dapat dengan mudah menampilkan daftar todo dalam halaman web kita dengan menggunakan data yang ada dalam array todoItems.

Fragment dalam JSX

Fragment adalah komponen kosong dalam React yang memungkinkan kita untuk menyusun beberapa elemen dalam satu grup tanpa menambahkan elemen pembungkus eksternal seperti <div> atau <span>. Fragment memungkinkan kita untuk mengurangi overhead yang tidak perlu di DOM dan membuat kode lebih bersih.

Penggunaan Fragment penting karena dapat membantu menghindari adanya elemen pembungkus eksternal yang tidak diinginkan di dalam struktur DOM. Ini terutama berguna ketika kita ingin merender daftar elemen tanpa menambahkan elemen ekstra ke DOM yang tidak diperlukan.

Untuk menggunakan Fragment dalam JSX React, kita dapat menggunakan tag kosong <></> . Berikut adalah contoh cara menggunakannya:

import React from 'react';
import './App.css';

function App() {
  return (
    <>
      <h1>Daftar Produk</h1>
      <ul>
        <li>Produk 1</li>
        <li>Produk 2</li>
        <li>Produk 3</li>
      </ul>
    </>
  );
}

export default App;

Event Handling dalam JSX

Event handling merupakan salah satu aspek penting dalam pengembangan aplikasi web, termasuk dalam penggunaan JSX di React. Dalam blog ini, kita akan membahas cara menambahkan event handler ke elemen dalam JSX untuk menangani interaksi pengguna.

Apa itu Event Handler ?

Event handler adalah fungsi JavaScript yang dieksekusi ketika sebuah event terjadi pada elemen HTML. Contoh event yang umum adalah klik mouse, hover, input keyboard, dan lainnya. Dalam React, kita bisa menambahkan event handler langsung ke elemen JSX untuk menangani event tersebut.

Syntax Dasar

Untuk menambahkan event handler ke elemen dalam JSX, kita bisa menggunakan properti HTML seperti onClick, onMouseOver, onChange, dan sebagainya. Berikut adalah contoh syntax dasarnya:

import React from 'react';

function MyComponent() {
  // Event handler function
  function handleClick() {
    console.log('Button clicked!');
  }

  return (
    <button onClick={handleClick}>Click me!</button>
  );
}

export default MyComponent;

Pada contoh di atas, kita menambahkan event handler onClick ke elemen <button>. Ketika tombol tersebut diklik, fungsi handleClick() akan dieksekusi

Passing Parameters to Event Handlers

Jika kita ingin meneruskan parameter ke dalam event handler, kita bisa menggunakan arrow function atau method bind(). Contoh:

import React from 'react';

function MyComponent() {
  // Event handler function
  function handleClick() {
    console.log('Button clicked!');
  }

  return (
    <button onClick={handleClick}>Click me!</button>
  );
}

export default MyComponent;

Atau menggunakan method bind():

import React from 'react';

function MyComponent() {
  function handleClick(message) {
    console.log(message);
  }
  return (
    <div>
      <button type="button" onClick={handleClick.bind(null, 'Button clicked!')}>
        Click me!
      </button>
    </div>
  );
}

export default MyComponent;

Event Menggunakan Event Object

Event handler dapat menerima parameter event object, yang berisi informasi tentang event yang terjadi. Contoh penggunaannya:

import React from 'react';

function MyComponent() {
  function handleClick(event) {
    console.log('Button clicked!', event.target);
  }

  return (
    <button type="button" onClick={handleClick}>
      Click me!
    </button>
  );
}

export default MyComponent;

Berikut link repository belajar jsx dari blog ini:

https://github.com/arief2020/blog-jsx

Kesimpulan

Dalam blog ini, kita telah membahas beberapa aspek penting dalam penggunaan JSX (JavaScript XML) di React. Berikut adalah kesimpulan untuk setiap materi yang telah kita bahas:

  1. Sintaks Dasar JSX: JSX memungkinkan kita untuk menuliskan kode HTML secara langsung di dalam JavaScript, membuat kode menjadi lebih ekspresif dan mudah dibaca.

  2. Penggunaan Variabel & Ekspresi di JSX: Kita dapat menggunakan variabel JavaScript dan ekspresi di dalam JSX dengan menggunakan kurung kurawal {}. Hal ini memungkinkan kita untuk memasukkan nilai dinamis ke dalam elemen JSX.

  3. Prop di JSX: Properti (props) digunakan untuk meneruskan data dari komponen induk ke komponen anak dalam React. Properti ini dapat diakses dan digunakan di dalam elemen JSX untuk menampilkan data yang relevan.

  4. Conditional Rendering di JSX: Dengan menggunakan struktur kontrol seperti if atau operator ternary, kita dapat melakukan conditional rendering di JSX. Hal ini memungkinkan kita untuk menampilkan atau menyembunyikan elemen berdasarkan kondisi tertentu.

  5. List and Key dalam JSX: Ketika melakukan rendering list data di React, kita perlu menggunakan properti key untuk memberikan identifier unik kepada setiap elemen dalam list. Hal ini membantu React dalam mengidentifikasi perubahan yang terjadi pada setiap elemen.

  6. Fragment dalam JSX: Fragment digunakan untuk mengelompokkan beberapa elemen JSX tanpa menambahkan elemen tambahan ke dalam DOM. Ini berguna ketika kita ingin mengembalikan beberapa elemen tetapi tidak memerlukan elemen pembungkus tambahan.

  7. Event Handling di JSX: Event handler digunakan untuk menangani interaksi pengguna seperti klik tombol, input keyboard, atau hover mouse. Kita dapat menambahkan event handler langsung ke elemen JSX dengan menggunakan properti seperti onClick, onMouseOver, dan lainnya.

Dengan pemahaman tentang konsep-konsep dasar JSX dan penggunaannya dalam berbagai situasi, kita dapat membangun aplikasi React yang lebih dinamis, interaktif, dan mudah dipelihara. Semoga blog ini bermanfaat bagi pembaca untuk memulai atau meningkatkan pemahaman mereka tentang penggunaan JSX dalam pengembangan aplikasi web dengan React.