Main Menu

Belajar React Dasar #14: Custom Hooks


👍 0 ❤️ 0 💡 0 🔥 0 🙌 0 🥳 0
Belajar React Dasar #14: Custom Hooks

Halo teman-teman semuanya, pada artikel sebelumnya kita sudah belajar tentang Context API, bagaimana cara berbagi data antar component tanpa harus melakukan props drilling.

Pada artikel kali ini, kita akan membahas tentang Custom Hooks, yaitu bagaimana kita bisa membuat hook buatan sendiri untuk menyederhanakan logika yang berulang agar bisa digunakan kembali di banyak component.

Apa Itu Custom Hooks?

Custom Hook adalah fungsi JavaScript biasa yang menggunakan hook React (seperti useState, useEffect, useRef, dll), dan namanya selalu diawali dengan kata use.

Tujuan custom hook adalah untuk mengabstraksi logika yang sering dipakai berulang, supaya lebih rapi dan bisa digunakan di berbagai component.

Langkah 1 - Membuat Custom Hook Sederhana

Mari kita buat custom hook untuk melacak lebar jendela (window width). Silahkan teman-teman buat file useWindowWidth.js di folder src/hooks:

import { useState, useEffect } from "react";

function useWindowWidth() {
  const [width, setWidth] = useState(window.innerWidth);

  useEffect(() => {
    const handleResize = () => setWidth(window.innerWidth);

    window.addEventListener("resize", handleResize);

    // cleanup saat component di-unmount
    return () => window.removeEventListener("resize", handleResize);
  }, []);

  return width;
}

export default useWindowWidth;

Penjelasan:

  • Hook useWindowWidth menyimpan state width.
  • Saat ukuran jendela berubah, state diperbarui.
  • Hook mengembalikan nilai width agar bisa dipakai di component lain.

Langkah 2 - Menggunakan Custom Hook

Sekarang mari kita gunakan custom hook useWindowWidth di dalam component App.

import useWindowWidth from "./hooks/useWindowWidth";

function App() {
  const width = useWindowWidth();

  return (
    <div>
      <h1>Lebar Jendela: {width}px</h1>
    </div>
  );
}

export default App;

Penjelasan:

  • Kita panggil useWindowWidth() seperti hook bawaan.
  • Hook tersebut mengembalikan lebar jendela saat ini.
  • UI otomatis ter-update ketika jendela di-resize.

Langkah 3 - Custom Hook dengan State Lebih Kompleks

Custom hook juga bisa mengelola logika form agar tidak ditulis berulang. Silahkan teman-teman buat file useForm.js di folder src/hooks:

import { useState } from "react";

function useForm(initialValues) {
  const [values, setValues] = useState(initialValues);

  const handleChange = (e) => {
    setValues({ ...values, [e.target.name]: e.target.value });
  };

  const resetForm = () => {
    setValues(initialValues);
  };

  return { values, handleChange, resetForm };
}

export default useForm;

Menggunakan hook ini di App.jsx:

import useForm from "./hooks/useForm";

function App() {
  const { values, handleChange, resetForm } = useForm({
    email: "",
    password: "",
  });

  const handleSubmit = (e) => {
    e.preventDefault();
    alert(`Email: ${values.email}, Password: ${values.password}`);
    resetForm();
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="email"
        name="email"
        value={values.email}
        onChange={handleChange}
        placeholder="Email"
      />
      <input
        type="password"
        name="password"
        value={values.password}
        onChange={handleChange}
        placeholder="Password"
      />
      <button type="submit">Login</button>
    </form>
  );
}

export default App;

Penjelasan:

  • useForm menyimpan state untuk input form.
  • handleChange mengupdate nilai form sesuai input.
  • resetForm mengembalikan nilai ke kondisi awal.

Kesimpulan

Pada artikel ini, kita sudah belajar tentang Custom Hooks. Dengan custom hook, kita bisa membuat logika yang bisa digunakan kembali di banyak component, sehingga kode lebih bersih, terstruktur, dan mudah dikelola.

Kita sudah mencoba membuat custom hook sederhana (useWindowWidth) dan custom hook form (useForm).

Terima kasih


Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami