img-fe-interview
#frontend #interview

React.js

  1. Apa itu JSX ? dan bagaimana bisa dirender di HTML ?

    • JSX (JavaScript XML) adalah sintaks yang memungkinkan kita menulis HTML di dalam JavaScript.
    • JSX tidak bisa langsung dipahami oleh browser, jadi React menggunakan Babel untuk mengonversi JSX menjadi kode JavaScript biasa, misalnya:
    React.createElement('h1', null, 'Hello, Ubay!')
    
  2. Jelaskan lifecycle dari ReactJS?

    • Lifecycle adalah serangkaian metode yang dipanggil selama siklus hidup suatu komponen.

    • Mounting: constructor(), render(), componentDidMount()

    • Updating: shouldComponentUpdate(), render(), componentDidUpdate()

    • Unmounting: componentWillUnmount()

    Pada Hooks, lifecycle” ini bisa digantikan dengan useEffect().

  3. Jelaskan perbedaan Real DOM vs Virtual DOM!

    FiturReal DOMVirtual DOM
    PerformaLambatCepat
    RenderingMengubah semua elemenHanya mengubah elemen yang berubah
    EfisiensiTidak optimalOptimal dengan Diffing Algorithm (membandingkan Virtual DOM lama & baru)
  4. Mengapa ReactJS menggunakan virtual DOM dan bukan real DOM?

    • Virtual DOM mempercepat proses rendering dengan cara membandingkan perubahan sebelum mengupdate DOM asli. Ini disebut dengan Reconciliation.
  5. Apa kegunaan prop key, dan apa yang terjadi jika tidak menggunakannya?

    • Key digunakan dalam list untuk memberikan identitas unik pada setiap elemen.
    • Jika tidak ada key, React harus mengecek ulang semua elemen dalam list, yang bisa memperlambat kinerja.
  6. Kapan dan Mengapa menggunakan State Management dan tidak?

    • Gunakan state management jika state dipakai di banyak komponen.
    • Jika hanya beberapa komponen, cukup gunakan useState() atau useContext()
  7. Apa saja Hooks yang pernah digunakan? Jelaskan juga setiap kegunaannya

    HookFungsi
    useStateMenyimpan state lokal
    useEffectMenjalankan efek samping (API call, event listener, dll.)
    useContextMenggunakan nilai dari Context API
    useMemoOptimalisasi perhitungan berat
    useCallbackOptimalisasi fungsi agar tidak berubah setiap render
    useRefMenyimpan referensi tanpa menyebabkan re-render
    useReducerAlternatif useState untuk manajemen state yang kompleks
  8. Mengapa Hooks harus selalu dipanggil di top-level sebuah component?

    • Karena React menggunakan rules of hooks, yaitu:
      • Hooks harus dipanggil dalam urutan yang sama di setiap render.
      • Tidak boleh dipanggil dalam loop, kondisi, atau nested function.
    • Jika dilanggar, bisa menyebabkan bug yang sulit dideteksi.
  9. Apa itu high order component?

    • HOC adalah fungsi yang menerima komponen dan mengembalikan komponen baru dengan tambahan props atau behavior.
    // component dengan HOC
    const withBorder = (Component) => (props) => (
      <div style={{ border: '1px solid red' }}>
        <Component {...props} />
      </div>
    )
    
    // component button
    const Button = () => {
      return <button>Click me</button>
    }
    export default withBorder(Button)
    
  10. Kapan harus pake context kapan harus pake redux?

    KriteriaContext APIRedux
    KompleksitasSederhanaKompleks
    SkalaKecil hingga menengahBesar
    PerformanyaBagus untuk state kecilLebih efisien untuk state besar
  11. Apa bedanya pure component sama functional component?

    • Pure Component: Hanya re-render jika state atau props berubah (digunakan pada React.PureComponent).
    • Functional Component: Re-render setiap kali parent-nya re-render.
  12. Apa perbedaan Class Component dengan Functional Component?

    JenisClass ComponentFunctional Component
    SintaksMenggunakan classMenggunakan function
    Statethis.stateuseState()
    LifecyclecomponentDidMount()useEffect()

    React lebih merekomendasikan Functional Component karena lebih ringan dan mudah dibaca.

  13. Apa itu SSR dan CSR, kapan kita harus make CSR atau SSR?

    • SSR dan CSR adalah dua teknik dalam rendering halaman web. Masing-masing punya kelebihan dan kekurangan tergantung pada kebutuhan aplikasi.

      • βœ… SSR adalah proses rendering halaman web di server sebelum dikirim ke browser.
      • πŸ“Œ Cara Kerja SSR:
        • Browser mengirim request ke server.
        • Server membangun halaman HTML lengkap dan mengirimkannya ke browser.
        • Browser langsung menampilkan halaman yang sudah di-render oleh server.
      • πŸ“Œ Kelebihan SSR:
        • βœ… SEO-friendly β†’ Mesin pencari bisa membaca halaman dengan mudah.
        • βœ… Faster First Load β†’ Halaman langsung muncul karena sudah di-render oleh server.
        • βœ… Baik untuk konten yang sering berubah (misalnya berita, e-commerce, dll.).
      • ⚠ Kekurangan SSR:
        • ❌ Setiap request membutuhkan render ulang di server β†’ bisa lebih lambat untuk navigasi selanjutnya.
        • ❌ Beban server lebih tinggi dibanding CSR.


      • βœ… CSR adalah proses rendering halaman web di browser menggunakan JavaScript setelah menerima halaman kosong dari server.
        • πŸ“Œ Cara Kerja CSR:
          • Browser meminta halaman ke server.
          • Server hanya mengirim HTML dasar + JavaScript (tanpa konten).
          • JavaScript di browser mengambil data dari API, lalu merender halaman secara dinamis.
        • πŸ“Œ Kelebihan CSR:
          • βœ… Lebih cepat setelah halaman pertama dimuat, karena navigasi hanya perlu update bagian tertentu tanpa reload halaman.
          • βœ… Interaktif dan lancar seperti aplikasi (SPA - Single Page Application).
          • βœ… Beban server lebih ringan, karena rendering dilakukan di client.
        • ⚠ Kekurangan CSR:
          • ❌ SEO lebih sulit (karena mesin pencari hanya melihat HTML kosong sebelum JavaScript dijalankan).
          • ❌ First Load lebih lambat karena butuh download dan eksekusi JavaScript sebelum halaman muncul.


      • πŸ“Œ 4. Kapan Menggunakan SSR atau CSR?

      • βœ… Gunakan SSR jika:
        • Website membutuhkan SEO yang kuat (misalnya blog, berita, e-commerce).
        • Halaman harus muncul secepat mungkin saat pertama kali diakses.
        • Konten berubah sering, tapi tetap butuh indeksasi oleh Google.

      • βœ… Gunakan CSR jika:
        • Aplikasi bersifat interaktif seperti dashboard, chat, atau media sosial.
        • Navigasi antar halaman harus cepat tanpa reload.
        • Tidak terlalu peduli dengan SEO atau hanya menargetkan pengguna login.
  14. Perbedaan Controlled vs uncontrolled components di React?

    • Controlled: State dikontrol oleh React (useState).
    • Uncontrolled: Menggunakan ref untuk mendapatkan nilai input.
  15. Bagaimana cara agar browser dan server dapat berkomunikasi tanpa reload halaman?

    • AJAX (fetch, axios)
    • WebSocket (untuk real-time)
    • Server-Sent Events (SSE)
  16. Apa itu memoization? Apa manfaatnya dalam aplikasi React?

    • Memoization adalah teknik caching untuk mencegah perhitungan ulang yang tidak perlu.
    • React Hooks yang mendukung memoization:
      • useMemo(): Mencegah perhitungan ulang nilai.

      • useCallback(): Mencegah pembuatan ulang fungsi.

    Manfaat: Meningkatkan performa dengan menghindari render ulang yang tidak perlu.

  17. Bagaimana perbedaan pengunaan useMemo dan useCallback?

    • βœ” useMemo β†’ Cache hasil perhitungan, menghindari perhitungan ulang yang mahal.
    • βœ” useCallback β†’ Cache fungsi, mencegah pembuatan fungsi baru di setiap render.
    • ⚑ Gunakan useMemo untuk perhitungan berat, dan useCallback untuk optimasi fungsi agar tidak menyebabkan re-render!

    πŸ“Œ 1. useMemo β†’ Mem-Cache Nilai Hasil Perhitungan

    • βœ… Gunakan useMemo saat ada perhitungan berat yang tidak ingin dieksekusi berulang kali setiap re-render.
    • βœ… Mengembalikan nilai yang telah dihitung dan hanya dihitung ulang jika dependensinya berubah.

    • ❌ Tanpa useMemo (Setiap Render Hitung Ulang)
    import { useState } from 'react'
    
    function ExpensiveComponent({ numbers }) {
      const sum = numbers.reduce((acc, num) => acc + num, 0) // Perhitungan berat
    
      return <div>Sum: {sum}</div>
    }
    
    export default function App() {
      const [count, setCount] = useState(0)
      const numbers = Array.from({ length: 1000000 }, (_, i) => i + 1) // Data besar
    
      return (
        <div>
          <ExpensiveComponent numbers={numbers} />
          <button onClick={() => setCount(count + 1)}>Increment {count}</button>
        </div>
      )
    }
    

    πŸ”΄ Masalah:

    • Setiap kali tombol diklik, perhitungan reduce dijalankan ulang, padahal tidak ada perubahan pada numbers.
    • Ini memperlambat UI karena perhitungan yang berat selalu dilakukan ulang.

    • βœ… Dengan useMemo()
    import { useState, useMemo } from 'react'
    
    function ExpensiveComponent({ numbers }) {
      const sum = useMemo(() => {
        console.log('Calculating sum...')
        return numbers.reduce((acc, num) => acc + num, 0)
      }, [numbers]) // Hanya dihitung ulang jika `numbers` berubah
    
      return <div>Sum: {sum}</div>
    }
    
    export default function App() {
      const [count, setCount] = useState(0)
      const numbers = Array.from({ length: 1000000 }, (_, i) => i + 1) // Data besar
    
      return (
        <div>
          <ExpensiveComponent numbers={numbers} />
          <button onClick={() => setCount(count + 1)}>Increment {count}</button>
        </div>
      )
    }
    

    βœ… Keuntungan useMemo

    • Perhitungan reduce tidak dieksekusi ulang setiap kali state berubah.
    • Hanya dihitung saat numbers berubah, meningkatkan performa.

    πŸ“Œ 2. useCallback β†’ Mem-Cache Fungsi

    • βœ… Gunakan useCallback saat sebuah fungsi sering dibuat ulang tanpa perlu.
    • βœ… Mencegah re-render komponen anak yang menerima fungsi sebagai prop (karena setiap render, fungsi dianggap berbeda).

    • ❌ Tanpa useCallback (Fungsi Dibuat Ulang Terus)
    import { useState } from 'react'
    
    function Child({ onClick }) {
      console.log('Child re-rendered!')
      return <button onClick={onClick}>Click Me</button>
    }
    
    export default function App() {
      const [count, setCount] = useState(0)
    
      const handleClick = () => {
        console.log('Button clicked!')
      }
    
      return (
        <div>
          <Child onClick={handleClick} />
          <button onClick={() => setCount(count + 1)}>Increment {count}</button>
        </div>
      )
    }
    

    πŸ”΄ Masalah:

    • Setiap kali App re-render (karena count berubah), handleClick dibuat ulang.
    • Child selalu re-render meskipun onClick tidak berubah (karena dianggap sebagai fungsi baru).

    • βœ… dengan useCallback()
    import { useState, useCallback } from 'react'
    
    function Child({ onClick }) {
      console.log('Child re-rendered!')
      return <button onClick={onClick}>Click Me</button>
    }
    
    export default function App() {
      const [count, setCount] = useState(0)
    
      const handleClick = useCallback(() => {
        console.log('Button clicked!')
      }, []) // Fungsi hanya dibuat sekali
    
      return (
        <div>
          <Child onClick={handleClick} />
          <button onClick={() => setCount(count + 1)}>Increment {count}</button>
        </div>
      )
    }
    

    βœ… Keuntungan useCallback

    • handleClick tidak dibuat ulang setiap render (hanya dibuat sekali).
    • Child tidak akan re-render kecuali ada perubahan pada onClick.
    • Menghemat performa pada komponen yang sering menerima fungsi sebagai prop.
  18. Apa itu React Router?

    • React Router adalah library yang memungkinkan navigasi antar halaman dalam aplikasi React.