ReactJS: Hal Penting yang Sering Lupa Kalau Baru Belajar

ReactJS: Hal Penting yang Sering Lupa Kalau Baru Belajar
Photo by Florian Olivo / Unsplash

Belajar ReactJS itu kayak masuk ke dunia baru yang seru, tapi kadang ada aja detail-detail kecil yang bikin kita garuk-garuk kepala. Apalagi kalau baru mulai, banyak konsep yang kelihatannya gampang padahal punya "jebakan betmen" tersendiri. Nah, artikel ini bakal ngebahas hal-hal penting yang sering banget kelupaan atau kelewat pas kita lagi asyik-asyiknya belajar React. Yuk, kita bedah satu-satu biar proses belajarmu makin lancar jaya!

1. JSX Itu Bukan Cuma HTML dalam JavaScript

Ini poin pertama yang krusial. Saat pertama lihat JSX, kita sering mikir, "Oh, ini mah HTML biasa." Padahal, JSX itu bukan HTML murni. Itu sintaks JavaScript yang spesial yang dipakai buat ngedeskripsiin struktur UI. Nantinya, kode JSX ini bakal ditranspilasi (diubah) jadi panggilan fungsi JavaScript biasa (pakai React.createElement()).

Kenapa ini penting? Karena pemahaman ini bikin kita sadar kalau di dalam kurung kurawal {} di JSX itu kita bisa nulis ekspresi JavaScript. Bukan statement ya, tapi ekspresi. Jadi, kamu bisa nulis angka + 5, namaVariabel, fungsi(argumen), atau bahkan kondisi pakai ternary operator kondisi ? nilaiKalauTrue : nilaiKalauFalse. Tapi kamu nggak bisa nulis if (kondisi) { ... } atau for (...) { ... } langsung di dalam {}. Nah, pemahaman dasar ini penting banget biar nggak bingung pas mau nampilin data atau logika simpel di UI. Seringkali, pemula coba masukin if atau loop langsung di {} dan error. Ingat, ekspresi!

2. State Updates Itu Asynchronous, Bukan Langsung Berubah

Ini salah satu sumber kebingungan paling umum. Ketika kamu memanggil setState (kalau pakai class component) atau setNamaState (kalau pakai hook useState), kamu mungkin berharap nilai state-nya langsung berubah detik itu juga. Padahal, enggak! React itu batch (mengelompokkan) update state untuk performa yang lebih baik. Jadi, panggilan setNamaState(nilaiBaru) itu nggak menjamin namaState langsung berisi nilaiBaru di baris kode setelah panggilan itu.

Contoh simpel:

javascript
const [count, setCount] = useState(0);

Di contoh di atas, console.log(count) kemungkinan besar masih akan nampilin nilai count sebelum diupdate, bukan nilai setelah diupdate.

Lalu gimana dong kalau mau melakukan sesuatu setelah state berubah? Kamu bisa pakai useEffect dengan dependency state yang bersangkutan, atau kalau update state-nya bergantung pada nilai state sebelumnya, gunakan functional update form: setCount(prevCount => prevCount + 1). Ini penting banget buat menghindari bug yang susah dicari pas kamu ngerjain fitur yang butuh urutan update state yang tepat.

3. Pentingnya Keys Saat Merender List

Pasti sering banget kan nampilin daftar item dari array pakai metode map()? Nah, React bakal ngasih peringatan di console kalau setiap item dalam daftar itu nggak punya properti key yang unik. Warning ini sering diabaikan sama pemula, padahal key itu penting banget buat performa dan kebenaran rendering list.

Kenapa penting? key itu ngebantu React mengidentifikasi item mana yang berubah, ditambahkan, atau dihapus. Saat data list kamu berubah, React pakai key ini buat nentuin elemen DOM mana yang perlu diupdate daripada ngebangun ulang seluruh list dari awal. Kalau nggak ada key atau key-nya nggak unik/stabil, React bakal bingung. Ini bisa bikin performa menurun, bahkan kadang UI-nya jadi aneh (misalnya, inputan di salah satu item list yang kehapus tiba-tiba muncul di item lain).

Terus, key yang bagus itu gimana? key harus unik di dalam list yang sama, dan harus stabil (artinya, key untuk item data yang sama harus selalu sama meskipun list-nya dirender ulang). Hindari pakai index dari array sebagai key kalau list-nya bisa berubah urutan, ditambah, atau dihapus. Kenapa? Karena index itu nggak stabil. Item yang sama bisa punya index yang berbeda kalau ada item lain di depannya yang dihapus atau ditambah. Paling aman pakai ID unik dari data itu sendiri (misal, ID dari database).

javascript
// Kurang bagus kalau list-nya bisa berubah
data.map((item, index) => (
  
));

4. Memahami Dependency Array di useEffect dan Fungsi Cleanup

Hook useEffect ini powerful banget buat nanganin side effects kayak fetching data, nambahin event listener, manipulasi DOM langsung, dll. Tapi penggunaannya sering salah, terutama soal dependency array (array kosong atau berisi variabel di akhir useEffect).

Dependency array ini ngasih tahu React kapan useEffect harus dijalankan ulang. Kalau nggak ada dependency array sama sekali: useEffect bakal jalan setiap kali* component dirender ulang. Kalau dependency array-nya kosong ([]): useEffect cuma jalan sekali* pas component pertama kali muncul (mount). Mirip componentDidMount di class component. Kalau dependency array-nya berisi variabel ([variabel1, variabel2]): useEffect bakal jalan pertama kali saat mount, dan* setiap kali nilai dari variabel1 atau variabel2 berubah. Mirip kombinasi componentDidMount dan componentDidUpdate.

Kesalahan yang sering terjadi adalah lupa masukin dependency yang relevan. Misalnya, kamu fetching data yang butuh ID user, tapi lupa masukin userId ke dependency array. Akibatnya, data nggak ke-fetch ulang pas user ID-nya berubah. Atau kebalikannya, masukin terlalu banyak dependency yang nggak perlu, bikin effect jalan terlalu sering.

Selain itu, jangan lupa fungsi cleanup. Kalau useEffect-mu bikin "langganan" (misal: event listener, timer, subscription WebSocket), kamu harus "berhenti berlangganan" saat component hilang (unmount) atau sebelum effect dijalankan ulang. Caranya dengan me-return sebuah fungsi dari dalam useEffect. Fungsi yang di-return inilah fungsi cleanup-nya.

javascript
useEffect(() => {
  const timerId = setInterval(() => {
    console.log('Timer jalan...');
  }, 1000);

Lupa cleanup bisa menyebabkan memory leak atau perilaku yang nggak diinginkan.

5. State Immutability: Jangan Pernah Mutasi State Secara Langsung!

Ini aturan emas di React (dan Redux/lainnya). State itu harus dianggap immutable (tidak bisa diubah). Artinya, ketika kamu mau mengubah state yang isinya objek atau array, kamu nggak boleh langsung memodifikasi objek/array yang lama. Kamu harus bikin copy atau versi baru dari state tersebut, baru ubah copy-nya, lalu panggil setNamaState dengan copy yang sudah diubah itu.

Contoh salah (mutasi langsung):

javascript
const [items, setItems] = useState([{ id: 1, name: 'A' }]);const addItem = (newItem) => {
  items.push(newItem); // SALAH! Memutasi array state secara langsung
  setItems(items);     // React nggak 'ngeh' kalau array-nya berubah
};

Kenapa ini salah? Karena React mendeteksi perubahan state dengan membandingkan referensi objek/array yang lama dan yang baru. Kalau kamu mutasi langsung, referensinya tetap sama, jadi React mikir state-nya nggak berubah dan nggak akan me-render ulang component.

Contoh benar (menggunakan immutability):

javascript
const [items, setItems] = useState([{ id: 1, name: 'A' }]);const addItem = (newItem) => {
  // Bikin array baru dengan spread operator
  setItems([...items, newItem]); // BENAR!
};

Ini fundamental banget. Kuasai teknik membuat copy objek/array baru pakai spread syntax (...), map, filter, slice, atau library helper seperti Immer kalau perlu.

6. Prop Drilling vs. Context API vs. State Management Global

Saat aplikasi makin besar, kamu mungkin bakal ngalamin "prop drilling", yaitu ngasih properti (props) dari component induk ke component anak, lalu ke cucu, cicit, dan seterusnya, padahal props itu cuma dipakai sama cicit. Ini bikin kode nggak enak dibaca, sulit di-maintain, dan merepotkan.

Pemula sering langsung lompat ke library state management global kayak Redux, Zustand, atau Recoil pas ngalamin ini. Padahal, React punya solusi bawaan yang namanya Context API.

Context API itu ibarat saluran khusus buat ngasih data "global" (atau semi-global) ke component-component di dalam tree, tanpa harus ngasih props satu per satu. Cocok buat data kayak tema (gelap/terang), info user yang sedang login, atau pengaturan bahasa.

javascript
// Buat Context
const ThemeContext = createContext('light');// Sediakan Context di component induk
function App() {
  return (
    
       {/ Anak dari App /}
    
  );
}

Context API itu simpel dan cukup buat banyak kasus. Baru kalau state-mu sangat kompleks, butuh manajemen state yang lebih terstruktur, ada banyak aksi asynchronous, atau butuh debugging time travel, baru deh pertimbangkan library state management eksternal. Jangan terburu-buru pakai Redux kalau cuma butuh ngasih data tema ke beberapa component.

7. Controlled vs. Uncontrolled Components dalam Form

Nanganin form itu salah satu tugas paling umum di aplikasi web. Di React, ada dua cara utama: controlled components dan uncontrolled components. Pemula kadang nggak paham bedanya atau kenapa controlled components itu seringkali lebih disukai.

  • Uncontrolled Components: Elemen form (input, textarea, select) nanganin state-nya sendiri di DOM, bukan di state React. Kamu ngambil nilainya pas submit form, biasanya pakai useRef. Mirip cara kerja form HTML biasa.
javascript
    function NameForm() {
      const inputRef = useRef(null);
      function handleSubmit(event) {
        alert('Nama: ' + inputRef.current.value);
        event.preventDefault();
      }
      return (
        
          Nama: 
          Submit
        
      );
    }
  • Controlled Components: Nilai elemen form disimpan di state React, dan setiap perubahan (via event onChange) langsung mengupdate state. Elemen form "dikontrol" sepenuhnya oleh state React.
javascript
    function NameForm() {
      const [name, setName] = useState('');
      function handleChange(event) {
        setName(event.target.value);
      }
      function handleSubmit(event) {
        alert('Nama: ' + name);
        event.preventDefault();
      }
      return (
        
          Nama: 
          Submit
        
      );
    }

Controlled components seringkali lebih disukai karena:

  • Nilai form selalu ada di state React, gampang diakses.

Validasi form real-time* jadi lebih mudah.

  • Bisa mengendalikan nilai form secara programatis (misal: reset form, mengisi nilai default).
  • Mengimplementasikan input mask, auto-save, dll. jadi lebih simpel.

Meskipun uncontrolled components kadang berguna untuk form yang sangat simpel atau integrasi dengan library DOM lain, kuasai dulu controlled components karena ini pola yang lebih umum dan kuat di React.

8. Manfaatkan React Developer Tools

Ini bukan konsep koding, tapi alat yang sering dilupakan pemula. Instal ekstensi React Developer Tools di browser (Chrome/Firefox). Ini penyelamat hidup!

Dengan DevTools, kamu bisa:

  • Melihat struktur component tree di halamanmu.

Menginspeksi props dan state* dari setiap component.

  • Mengubah state dan props secara langsung (untuk debugging).
  • Melihat component mana yang me-render ulang (profiling).
  • Melacak asal-usul render.

Belajar menggunakan DevTools itu sama pentingnya dengan belajar koding React-nya sendiri. Ini bikin proses debugging jadi jauh lebih cepat dan efektif. Kalau ada component yang perilakunya aneh, lihat state dan props-nya di DevTools!

9. Baca Pesan Error dan Warning di Console

React itu "cerewet" soal kesalahan dan peringatan. Jangan pernah mengabaikan pesan-pesan merah atau kuning di console browser kamu. Seringkali, pesan error React sangat informatif dan langsung mengarahkan kamu ke masalahnya, bahkan ngasih saran perbaikan.

Pesan warning (kuning) juga penting, kayak warning soal keys di list tadi. Meskipun nggak bikin aplikasi langsung crash, warning biasanya nunjukin potensi masalah performa atau bug di masa depan. Jadikan kebiasaan buat selalu cek console pas ngembangin aplikasi React.

10. Belajar dari Dokumentasi Resmi

Yang terakhir tapi nggak kalah penting: dokumentasi resmi React itu E M A S. Tim React udah bikin dokumentasinya super lengkap, jelas, dan up-to-date. Apapun yang kamu bingungkan, kemungkinan besar jawabannya ada di sana, seringkali dengan contoh kode yang bagus.

Daripada langsung nyari tutorial di tempat lain (yang kadang informasinya udah nggak relevan atau polanya kurang bagus), coba biasakan diri untuk merujuk ke dokumentasi resmi dulu. Itu sumber ilmu paling valid tentang React.

Penutup

Belajar React itu perjalanan. Ada aja momen "aha!" dan momen "kok gini ya?". Hal-hal yang dibahas di atas itu seringkali jadi sandungan buat yang baru mulai, tapi sebenarnya itu pondasi penting buat nulis kode React yang bersih, efisien, dan mudah di-maintain.

Ingat, kesabaran dan banyak latihan itu kuncinya. Jangan takut nyoba, bikin error, baca pesannya, dan perbaiki. Gabung ke komunitas developer, tanya kalau ada yang nggak paham (setelah coba cari jawabannya sendiri ya!).

Semoga tips-tips tentang hal penting yang sering lupa pas baru belajar React ini bisa ngebantu proses belajarmu makin lancar dan menyenangkan. Semangat koding!