ReactJS Dasar
ReactJS Dasar
● https://developer.mozilla.org/en-US/docs/Web/API/Event
Kode : button/AlertButton.jsx
Event Propagation
Event Propagation
● Event di React Component akan selalu disebarkan ke Component
yang ada diatasnya (Event Propagation)
● Misal kita memiliki Div dengan Event onClick, lalu didalamnya kita
memiliki Button dengan Event onClick
● Ketika Button di klik, maka onClick di Button akan dipicu dan
selanjutnya onClick di Div juga akan dipicu
● Kadang mungkin kita tidak ingin hal itu terjadi, maka kita bisa
hentikan proses Event Propagation tersebut menggunakan method
stopPropagation()
● https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropag
ation
Kode : button/Toolbar.jsx
Kode : hello-world/main.jsx
Prevent Default
● Selain menghentikan Event Propagation, hal yang biasa kita lakukan
ketika membuat Event Handler adalah menghentikan default action
menggunakan preventDefault()
● https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDef
ault
● Misal kita membuat Form, ketika di dipicu Event onClick, kita ingin
hentikan default action Form Submit
Kode : form/SearchForm.jsx
Side Effect
Side Effect
● Apakah Component boleh memiliki Side Effect (efek samping)?
● Tentu saja boleh, namun biasanya Side Effect terjadi dikarenakan
adanya interaksi dari pengguna melalui Event Handler
● Misal, kita akan membuat Form Say Hello, dimana ketika Button di
klik, kita ingin menampilkan Hello + nama pada Text
Kode : form/SayHelloForm.jsx
DOM Manipulation
● Kode sebelumnya, kita menggunakan DOM Manipulation untuk
mengubah Component di React
● Hal ini sebenarnya tidak terlalu direkomendasikan, terutama jika
misal data yang memicu perubahan Element di Component
bersumber dari berbagai Event Handler
● Oleh karena itu, hal yang direkomendasikan adalah menggunakan
State, yang akan kita bahas di materi selanjutnya
Hooks
Hooks
● Hooks adalah fitur di React yang bisa digunakan di Component
● Ada banyak sekali fitur yang bisa kita gunakan di React Hooks, dan
kita akan bahas secara bertahap
● https://react.dev/reference/react/hooks
State
State
● Component kadang perlu untuk berubah dikarenakan interaksi yang
dilakukan pengguna
● Misal, input di klik bisa menaikkan data counter. Tombol next bisa
mengubah gambar banner yang sedang muncul, dan lain-lain
● Component harus bisa mengingat nilai saat ini, seperti counter saat
ini, gambar saat ini, dan lain-lain
● Di React, memori spesific di Component disebut State
State Menggunakan Local Variable Biasa
● Apakah local variabel biasa di Component bisa digunakan untuk
State? Sayangnya hal ini tidak bisa dilakukan
● Ketika React melakukan render Component untuk yang kedua kali
dan seterusnya, maka semua kode Component akan dieksekusi
ulang, oleh karena itu local variable akan kembali ke nilai awal
● Perubahan di local variable juga, tidak akan memicu render ulang
Component
Kode : form/Counter.jsx (Contoh Salah)
useState
● Untuk membuat State, kita bisa menggunakan function
useState(initial)
● https://react.dev/reference/react/useState
● Function useState akan mengembalikan array dengan dua nilai,
pertama adalah State-nya, dan kedua ada function untuk
mengubah value di State tersebut
● Component yang menggunakan State tersebut, secara otomatis
akan di render ulang
Kode : form/Counter.jsx
State Terisolasi dan Private
● State merupakan data yang terisolasi dan private secara local
terhadap Component yang menggunakan
● Artinya, jika kita me-render Component yang sama berkali-kali,
maka State dari tiap Component tersebut akan terpisah satu sama
lain
Kode : hello-world/main.jsx
Render
Render
● Sebelum Component yang kita buat ditampilkan di layar,
Component harus di render oleh React
● Oleh karena itu, kita perlu tahu bagaimana cara kerja proses React
ini ketika menampilkan Component yang kita buat
● Terdapat 3 tahapan proses menampilkan Component di React
● Pertama, trigger (memicu) proses render
● Kedua, melakukan proses render Component
● Ketiga, menempatkan hasil render Component ke DOM (Document
Object Model)
Proses Render di React
Trigger Render
● Pemicu render biasanya terjadi karena dua hal
● Pertama adalah inisialisasi awal Component, yang kita lakukan
menggunakan method render()
● Kedua adalah ketika ada pemicu perubahan State
● Setiap terjadi perubahan State, secara otomatis React akan
mengirimkan antrian untuk memicu proses render ulang
Render Component
● Setelah proses Trigger Render terjadi, React akan memanggil
Component yang kita buat untuk mencari tahu apa yang harus
ditampilkan di layar
● Rendering adalah proses React memanggil Component yang kita
buat
● Pada proses inisialisasi awal, React akan memanggil Root
Component (paling atas)
● Pada saat proses render ulang, React hanya akan memanggil ulang
Component yang state nya berubah
● Setelah proses render selesai, React akan melakukan proses
Commit
Commit Changes
● Setelah proses render selesai, React akan melakukan proses commit
changes (menyimpan perubahan) ke DOM
● Untuk inisialisasi awal, karena baru pertama kali, artinya element di
DOM belum ada, maka React akan menggunakan appendChild()
untuk menambahkan element ke DOM
● Sedangkan untuk proses render ulang, React akan mencoba
melakukan perubahan seminimal mungkin untuk menyamakan DOM
saat ini dengan hasil rendering
● React hanya akan mengubah element di DOM, jika memang
element tersebut berbeda dari hasil rendering
Snapshot
Snapshot
● Variable State sekilas mungkin terlihat seperti variable JavaScript biasa
● Tapi sebenarnya, State itu mirip seperti snapshot (kondisi saat itu).
Mengubah nilai variable State tidak akan mengubah Snapshot, melainkan
akan memicu render ulang untuk membuat Snapshot baru
● Kita mungkin berpikir bahwa tampilan web berubah secara langsung
karena response dari event yang dilakukan oleh pengguna, seperti klik
tombol
● Namun sebenarnya tidak seperti itu, kita sudah tahu di materi
sebelumnya, ketika terjadi perubahan State, itu akan memicu render
ulang, sehingga akan membuat Snapshot baru yang ditampilkan di layar
Kesalahan Mengubah State
● Paham tentang Snapshot ini, akan memberi gambaran cara
pandang kita terhadap data di State
● Berikut adalah contoh kesalahan yang biasa dilakukan ketika
mengubah State
● Kita berpikir jika mengubah State, saat itu juga data akan berubah,
padahal mengubah State sebenarnya hanyalah mentrigger render
ulang dengan nilai state yang baru
Kode : form/Counter.jsx
Kenapa Counter Tidak Berubah 3x?
● Hal ini dikarenakan, setCounter() tidak akan mengubah data
counter yang ada di Snapshot saat ini
● setCounter() hanya akan melakukan render ulang dengan data
counter yang baru
● Saat kita memanggil setCounter() sebanyak 3x, bukan berarti React
akan melakukan render ulang sebanyak 3x, React akan menunggu
sampai Event Handler selesai, jika ada perubahan State, maka akan
dilakukan render ulang
● Artinya render ulang akan dilakukan sekali saja, walaupun kita
mengubah State berkali-kali
Kode : form/Counter.jsx
State Updates
State Updates
● Seperti yang sebelumnya dibahas, melakukan update State berkali-
kali, tidak akan mengubah data State di Snapshot saat itu,
melainkan hanya memicu untuk render ulang dengan data State
baru
● Tapi, kadang-kadang, kita memang mungkin ada keperluan untuk
mengubah data di State yang sama berkali-kali
● Dan jika kita memang ingin mengubah data di State dengan data
yang harapannya sudah diubah sebelumnya (walaupun belum di
render ulang)
● Kita bisa menggunakan lambda sebagai parameter ketika
memanggil function untuk update data State
Kode : State Updates
Object di State
Object di State
● State bisa menyimpan jenis data JavaScript apapun, termasuk
Object
● Tapi kita tidak disarankan untuk mengubah object yang terdapat di
State
● Jika kita ingin mengubah object di State, kita disarankan membuat
object baru lalu mengubah data di State tersebut dengan object
baru
Immutable Data
● Saat kita membuat data di State, kita harus memperlakukan data di
State sebagai Immutable data (tidak bisa berubah)
● Artinya data di State hanya digunakan untuk dibaca (read only)
● Jika kita ingin mengubah data di State, maka kita harus ubah
menggunakan data baru, yang artinya data lama tidak dimodifikasi
● Ini adalah praktek yang biasa dilakukan di React. Walaupun pada
kenyataannya object di JavaScript tidak immutable
● Hal ini direkomendasikan agar kita tidak salah mengubah data
langsung, padahal kita tahu bahwa mengubah data tidak akan
memicu proses render ulang
● Untungnya di JavaScript kita bisa menggunakan Spread Syntax
untuk membantu meng-copy attribute di Object
Tugas
● Buat halaman baru dengan file
● contact.html
● src/contact/main.jsx
● src/contact/ContactForm.jsx
● Registrasikan ke vite.config.js
Kode : contact/ContactForm.jsx (1)
Kode : contact/ContactForm.jsx (2)
Nested Object
● Kadang ada kasus kita menggunakan Nested Object
● Sama seperti sebelumnya, kita disarankan untuk selalu membuat
object baru ketika mengubah State
● Kadang memang menyulitkan ketika Nested Object nya terlalu
besar, oleh karena itu disarankan tidak terlalu dalam membuat
Nested Object nya
Immer Library
● Salah satu library yang sering digunakan ketika develop aplikasi
menggunakan React adalah Immer
● Immer adalah library yang digunakan untuk membuat immutable
object dari object saat ini
● Menggunakan Immer akan lebih mudah dibandingkan
menggunakan Spread Syntax, terutama untuk Object yang
kompleks dan Nested
● https://github.com/immerjs/immer
Cara Kerja Library Immer
https://immerjs.github.io/immer/
Use Immer Library
● Library Immer juga bisa diintegrasikan dengan React State dengan
mudah
● Kita bisa menggunakan library Use-Immer
● https://github.com/immerjs/use-immer
● Kita cukup mengganti useState() menjadi useImmer()
● Dan untuk mengupdate Object di State, kita bisa menggunakan
Function sebagai parameter di Update Method nya
Menambah Library Immer
● npm install immer use-immer
Kode : contact/ContactForm.jsx
Array di State
Array di State
● Sama seperti Object, Array di State juga harus kita perlakukan
sebagai Immutable data
● Artinya operasi menambah data, mengubah atau menghapus data
di Array, kita harus buat Array baru untuk di update ke State
● Hal ini memang agak menyulitkan, oleh karena itu dengan bantuan
library seperti Immer, hal ini jadi lebih mudah
Mengubah Array
Hindari Gunakan
Tidak memicu render ulang ketika diubah Memicu render ulang ketika diubah
Mutable, bisa dimodifikasi dan diubah Immutable, kita hanya bisa mengubah
current value nya menggunakan function setValue
Tidak direkomendasikan membaca atau Bisa dibaca kapanpun, tapi tiap render
menulis current value ketika proses akan memiliki Snapshot masing-masing
rendering. Lebih cocok dibaca atau diubah
pada Event Handler
Kode : src/button/AlertButton.jsx
Tugas
● Buat halaman baru dengan file
● timer.html
● src/timer/main.jsx
● src/timer/Timer.jsx
● Registrasikan ke vite.config.js
Kode : src/timer/Timer.jsx
Manipulasi DOM dengan Ref
Manipulasi DOM dengan Ref
● React secara otomatis akan mengupdate DOM ketika melakukan
render ulang, jadi kita tidak perlu memanipulasi DOM secara
manual lagi
● Tapi, kadang kita mungkin perlu mengakses DOM secara manual,
contoh memindahkan fokus ke salah satu element, atau scroll ke
element tertentu, dan lain-lain
● Sayangnya, tidak ada cara untuk melakukan hal ini menggunakan
React, jadi kita perlu tangani hal ini secara manual
● Salah satu caranya kita menggunakan Ref menuju ke DOM element
● Caranya, pada element nya, kita bisa tambahkan attribute ref
Tugas
● Buat halaman baru dengan file
● guestbook.html
● src/guestbook/main.jsx
● src/guestbook/GuestBook.jsx
● Registrasikan ke vite.config.js
Kode : src/guestbook/GuestBook.jsx
Ref untuk Component
● Ref hanya bisa digunakan di DOM element, kita tidak bisa
menggunakan ref di Component
● Jika kita menambahkan Ref ke Component, maka attribute current
akan bernilai null
● Kita akan coba praktekan ini dengan membuat GuestBookInput
Component
Kode : src/guestbook/GuestBookInput.jsx
Kode : src/guestbook/GuestBook.jsx
Mengakses Component DOM Element
● Karena Component tidak bisa dijadikan sebagai Ref, oleh karena itu,
jika kita ingin menggunakan Ref untuk Component, kita bisa
menggunakan Props
● Kita bisa membuat Props ref yang kita isi Ref
● Props ref bisa kita gunakan pada DOM element di dalam Component
tersebut
● Sekarang kita coba tambahkan Ref ke dalam Component
GuestBookInput
Kode : src/guestbook/GuestBookInput.jsx
Effect
Effect Hooks
● Hooks selanjutnya yang akan kita bahas adalah Effect Hooks
● Beberapa Component mungkin butuh untuk berkomunikasi dengan
External System, misal berkomunikasi dengan Non-React
Component, berkomunikasi dengan Server, dan lain-lain
● Effect Hooks memungkinkan kita membuat kode yang dijalankan
setelah proses render sehingga kita bisa berkomunikasi dengan
system diluar React
● Effect terjadi setelah proses render selesai
● Kita bisa menggunakan useEffect() untuk membuat Effect
● https://react.dev/reference/react/useEffect
Kenapa Tidak Cukup Event Handler?
● Biasanya kita tahu bahwa Component itu harus Pure, dan tidak
memiliki efek samping
● Untuk kode yang memiliki efek samping, biasanya kita gunakan
Event Handler
● Namun, kadang ada kebutuhan kita memang perlu membuat
Component yang memiliki efek samping ketika dirender
● Misal ketika Component di render, kita ingin mengambil data dari
Server, sehingga bisa menyebabkan isi Component berubah (efek
samping) sesuai dengan response Server
● Disinilah Effect Hooks diperlukan
Tugas
● Buat halaman baru dengan file
● product.html
● src/product/main.jsx
● src/product/ProductList.jsx
● src/product/Product.jsx
● public/products.json
● Registrasikan ke vite.config.js
Kode : public/products.json
Kode : src/product/Product.jsx
Kode : src/product/ProductList.jsx
Infinite Loop
● Secara default, Effect akan dieksekusi setelah proses render
● Oleh karena itu, kita perlu berhati-hati, karena jika di dalam Effect
kita mengubah State, maka bisa terjadi infinite loop yang
menyebabkan proses render ulang terus-terusan terjadi tanpa henti
Kode : Infinite Loop (Jangan Dilakukan)
Effect Clean Up
● Pada beberapa kasus, mungkin kita butuh melakukan sesuatu
setelah eksekusi Effect selesai dilakukan
● Seperti misal di Try Catch, terdapat Finally
● Di Effect terdapat proses yang namanya Clean Up, Clean Up akan
dieksekusi setelah proses Effect selesai
● Caranya cukup mudah, kita tinggal return kan Closure Function di
dalam Effect
● Clean Up akan dieksekusi sebelum Effect selanjutnya di eksekusi,
atau Component di hilangkan
Kode : Effect Clean Up
Effect Dependencies
Effect Dependencies
● Secara default, Effect akan dieksekusi setiap selesai proses render
● Artinya jika proses render dilakukan berkali-kali, Effect akan
dieksekusi juga berkali-kali setelah proses render selesai
● Hal ini menjadikan kita harus melakukan pengecekan secara
manual seperti di materi sebelumnya jika tidak ingin kode Effect
dijalankan berkali-kali
● useEffect() memiliki parameter kedua yaitu Dependencies
● Kita bisa mengisi Dependencies dengan Array dari State, dimana
artinya Effect hanya akan dieksekusi jika State tersebut berubah,
jika tidak berubah maka Effect tidak akan dieksekusi
● Hal ini mungkin lebih mudah dibanding manual melakukan if else
Kode : src/product/ProductList.jsx
Empty Dependencies
● Kadang, kadang, mungkin kita hanya ingin memanggil Effect sekali
saja setelah pertama kali Component di Render, setelah itu kita
tidak mau memanggil Effect lagi, bahkan jika terjadi render ulang
● Pada kasus seperti itu, kita bisa gunakan empty array sebagai
dependencies, maka Effect hanya akan dipanggil sekali saja setelah
render pertama kali, selanjutnya tidak akan dipanggil lagi
Kode : src/product/ProductList.jsx
Async Code di Effect
Async Code di Effect
● Kadang, saat berhubungan dengan System External, misal
memanggil API, biasanya kita akan membuat kode Async Await
● Sayangnya, Effect tidak mendukung Async Function, oleh karena itu
jika kita bisa menggunakan Promise secara langsung, kita bisa
langsung saja gunakan Promise, tanpa menggunakan Async Await
● Namun, jika kita memang mau menggunakan Async Await, maka
kita harus buat function yang nandi dipanggil di useEffect()
● Misal, kita akan coba ubah kode sebelumnya menjadi kode Async
Await ketika mengambil data Products
Kode : src/product/ProductList.jsx
Jangan Gunakan Effect
Jangan Gunakan Effect
● Effect Hook adalah cara di luar dari yang biasa dilakukan di React.
● Effect memungkinkan kita keluar dari kebiasaan di React, dan
memungkinkan Component kita berinteraksi dengan External
System seperti Non React Component, Network, dan lain-lain
● Jika tidak ada interaksi dengan External System, maka sebaiknya
jangan gunakan Effect
● Meminimalisir penggunaan Effect akan membuat kode kita mudah
untuk dibaca, cepat dieksekusi dan minim error
Jangan Gunakan Effect untuk Inisialisasi Aplikasi
● Kadang beberapa proses dilakukan di awal sebelum halaman di
tampilkan
● Pada kasus ini, gunakan saja kode JavaScript langsung diluar React
● Jangan gunakan Effect untuk melakukan inisialisasi aplikasi
● Hal ini karena Effect akan dieksekusi setelah Render (setelah
ditampilkan), dan akan dieksekusi ulang jika terjadi render ulang
(bisa berkali-kali)
Jangan Gunakan Effect untuk Mengubah Data di Server