Project React sederhana untuk memahami Context API dan useEffect lifecycle (mount, update, unmount) serta memory leak.
npm install
npm run devBuka http://localhost:5173 di browser.
Tujuan: Memahami bahwa state secara default adalah lokal pada setiap component.
Demo: Component ThemeToggle menggunakan useState langsung.
Penjelasan:
- State
themeawalnya disimpan secara lokal - Setiap component memiliki state-nya sendiri
- Sulit untuk berbagi state antar component
Pertanyaan untuk peserta:
- "Bagaimana jika ada 100 component yang butuh akses ke theme yang sama?"
Tujuan: Memahami fase mount saat component pertama kali muncul di DOM.
Demo: Component MountDemo dengan useEffect kosong [].
Penjelasan:
useEffect(() => {
console.log('🔹 MOUNT')
return () => console.log('🔹 UNMOUNT')
}, [])- Array dependency kosong
[]= efek hanya jalan sekali saat mount - Cleanup function jalan saat unmount
Tips:
- Tunjukkan console log saat component mount
- Gunakan
setTimeoutdi dalam effect untuk simulasi:useEffect(() => { console.log('Component mounted!') const timer = setTimeout(() => { console.log('Timer selesai!') }, 2000) return () => clearTimeout(timer) }, [])
Tujuan: Memahami fase update saat state/props berubah.
Demo: Component UpdateDemo menggunakan Context API untuk theme.
Penjelasan:
useEffect(() => {
console.log('🔄 UPDATE:', theme)
setCount(c => c + 1)
}, [theme])- Dependency
theme= efek jalan setiap kali theme berubah - Context API memungkinkan state global diakses dimana saja
Penjelasan untuk peserta:
- Context API memecah masalah "prop drilling"
- Tidak perlu mengirim props ke component child yang tidak butuh
Tujuan: Memahami fase unmount saat component dihapus dari DOM.
Demo: Component UnmountDemo dengan cleanup function.
Penjelasan:
useEffect(() => {
console.log('🔸 MOUNT')
return () => console.log('🔸 UNMOUNT - cleanup!')
}, [])- Cleanup function berjalan saat component dihapus
- Sangat penting untuk membersihkan subscription/timer
Aksi untuk peserta:
- Klik "Show" → component mount (lihat console)
- Klik "Hide" → component unmount (lihat console)
Tujuan: Memahami apa itu memory leak dan cara mengatasinya.
Demo: Component MemoryLeakDemo dengan setInterval tanpa cleanup.
Masalah:
useEffect(() => {
console.log('🔴 MOUNT')
const interval = setInterval(() => {
setCount(c => c + 1)
}, 500)
// ❌ Cleanup DIKOMENTAR - ini cause memory leak!
}, [setCount])Yang Terjadi:
- Klik "Show" → interval dimulai, count meningkat
- Klik "Hide" → component di-unmount
- Interval tetap berjalan di background ❌
- Setiap 500ms, interval mencoba
setCountpada component yang sudah tidak ada - React mengeluarkan warning: "Can't perform a React state update on an unmounted component"
Verifikasi:
- Buka browser console
- Klik "Hide"
- Tunggu beberapa detik
- Lihat warning dari React
Solusi: Uncomment cleanup function:
useEffect(() => {
console.log('🔴 MOUNT')
const interval = setInterval(() => {
setCount(c => c + 1)
}, 500)
// ✅ Cleanup - WAJIB untuk mencegah memory leak!
return () => {
console.log('🟢 cleanup - clearing interval')
clearInterval(interval)
}
}, [setCount])Hasil:
- Saat component unmount, cleanup berjalan
clearInterval(interval)menghentikan timer- Tidak ada memory leak ✅
Konsep Inti:
return () => {...}di dalam useEffect = cleanup function- Cleanup jalan saat component unmount ATAU sebelum effect kedua berjalan
- SELALU bersihkan: subscriptions, event listeners, timers
| No | Materi | Status |
|---|---|---|
| 1 | Local State vs Global State (Context API) | ☐ |
| 2 | Mount Phase: component muncul di DOM | ☐ |
| 3 | Mount dengan setTimeout simulation | ☐ |
| 4 | Update Phase: state/props berubah | ☐ |
| 5 | Context API untuk theme global | ☐ |
| 6 | Unmount Phase: component dihapus dari DOM | ☐ |
| 7 | Cleanup function saat unmount | ☐ |
| 8 | Memory Leak: setInterval tanpa cleanup | ☐ |
| 9 | Memory Leak: dengan cleanup (solusi) | ☐ |
src/
├── App.jsx # Main component dengan ThemeProvider
├── App.css # Styling brutalist (B&W only)
├── context/
│ └── ThemeContext.jsx # Context API untuk theme
└── components/
├── ThemeToggle.jsx # Button toggle theme
├── LifecycleDemo.jsx # Container untuk demo
├── MountDemo.jsx # Demo mount phase
├── UpdateDemo.jsx # Demo update phase
├── UnmountDemo.jsx # Demo unmount phase
└── MemoryLeakDemo.jsx # Demo memory leak
- React 19 dengan Hooks
- Vite sebagai build tool
- Context API untuk state management
- useEffect untuk lifecycle management

