ReactJS - Higher-Order Components: A Beginner's Guide

Halo sana, para ahli React masa depan! Hari ini, kita akan memulai perjalanan menarik ke dunia Higher-Order Components (HOCs) di ReactJS. Jangan khawatir jika Anda baru saja memulai dalam pemrograman – saya akan menjadi panduan ramah Anda, dan kita akan mengambil ini langkah demi langkah. Pada akhir panduan ini, Anda akan membuat HOCs seperti seorang profesional!

ReactJS - Higher Order Components

Apa Itu Higher-Order Components?

Sebelum kita masuk ke detil, mari kita mengerti apa itu Higher-Order Components. Bayangkan Anda di sebuah restoran burger. Anda memesan burger biasa, tapi kemudian Anda memutuskan untuk menambah keju, selada, dan bacon. Proses menambah ekstra ini ke burger Anda mirip dengan apa yang dilakukan HOCs di React!

Dalam istilah React, Higher-Order Component adalah sebuah fungsi yang menerima komponen dan mengembalikan komponen baru dengan penambahan beberapa fungtionalitas. Itu seperti saus khusus yang meningkatkan komponen Anda tanpa mengubah bahan utamanya.

Berikut adalah analogi sederhana:

// Ini seperti burger biasa kita
const PlainBurger = () => <div>?</div>;

// Ini adalah HOC kita, seperti menambah topping
const addCheese = (Burger) => {
return () => (
<div>
<Burger />
<span>?</span>
</div>
);
};

// Ini adalah burger kita yang diperkaya dengan keju!
const CheeseBurger = addCheese(PlainBurger);

Dalam contoh ini, addCheese adalah Higher-Order Component kita. Itu mengambil PlainBurger dan mengembalikan komponen baru dengan keju ditambahkan!

Cara Menggunakan Higher-Order Components

Sekarang kita mengerti konsepnya, mari kita lihat bagaimana kita bisa menggunakan HOCs dalam konteks yang lebih praktis. mari kita katakan kita memiliki beberapa komponen yang perlu mengambil data dari API. Daripada menulis logika pengambilan data yang sama di setiap komponen, kita bisa membuat HOC untuk menangani ini bagi kita.

Berikut adalah contoh bagaimana kita bisa melakukannya:

import React, { useState, useEffect } from 'react';

// Ini adalah HOC kita
function withDataFetching(WrappedComponent, dataSource) {
return function(props) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);

useEffect(() => {
fetch(dataSource)
.then(response => response.json())
.then(result => {
setData(result);
setLoading(false);
})
.catch(e => {
setError(e);
setLoading(false);
});
}, []);

if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;

return <WrappedComponent data={data} {...props} />;
}
}

// Ini adalah komponen sederhana yang akan menerima data
function UserList({ data }) {
return (
<ul>
{data.map(user => <li key={user.id}>{user.name}</li>)}
</ul>
);
}

// Kita gunakan HOC untuk membuat komponen baru dengan kemampuan pengambilan data
const UserListWithData = withDataFetching(UserList, 'https://api.example.com/users');

// Sekarang kita bisa gunakan UserListWithData di aplikasi kita!
function App() {
return (
<div>
<h1>Daftar User</h1>
<UserListWithData />
</div>
);
}

mari kitauraikan ini:

  1. Kita mendefinisikan HOC withDataFetching. Itu menerima dua parameter: komponen yang kita ingin wrap (WrappedComponent) dan URL untuk mengambil data (dataSource).

  2. Dalam withDataFetching, kita membuat dan mengembalikan komponen functional baru. Komponen ini menggunakan hook React untuk mengelola state dan efek samping.

  3. Kita menggunakan useState untuk mengelola state data, loading, dan error.

  4. Kita menggunakan useEffect untuk mengambil data saat komponen dimuat. Setelah data diambil, kita memperbarui state sesuainya.

  5. Bergantung pada state, kita menampilkan pesan loading, pesan error, atau merender WrappedComponent dengan data yang diambil.

  6. Kita membuat komponen sederhana UserList yang diharapkan menerima data sebagai prop dan merender itu.

  7. Kita gunakan HOC untuk membuat komponen baru UserListWithData yang memiliki kemampuan pengambilan data.

  8. Akhirnya, kita gunakan UserListWithData di komponen App.

Menggunakan HOC Components

Sekarang kita telah melihat bagaimana membuat dan menggunakan HOC, mari kita lihat beberapa kasus penggunaan umum dan praktik terbaik.

HOC Autentikasi

Salah satu penggunaan umum HOC adalah untuk menangani autentikasi. Berikut adalah contoh:

function withAuth(WrappedComponent) {
return function(props) {
const [isAuthenticated, setIsAuthenticated] = useState(false);

useEffect(() => {
// Memeriksa apakah pengguna autentik
const token = localStorage.getItem('token');
setIsAuthenticated(!!token);
}, []);

if (!isAuthenticated) {
return <Redirect to="/login" />;
}

return <WrappedComponent {...props} />;
}
}

// Penggunaan
const ProtectedComponent = withAuth(SensitiveDataComponent);

HOC ini memeriksa apakah pengguna autentik sebelum merender komponen yang diwrap. Jika tidak, itu akan mengalihkan ke halaman login.

HOC Logging

Penggunaan lain yang berguna adalah menambahkan logging ke komponen:

function withLogging(WrappedComponent) {
return function(props) {
useEffect(() => {
console.log(`Component ${WrappedComponent.name} mounted`);
return () => console.log(`Component ${WrappedComponent.name} unmounted`);
}, []);

return <WrappedComponent {...props} />;
}
}

// Penggunaan
const LoggedComponent = withLogging(MyComponent);

HOC ini mencatat saat komponen dimuat dan dihapus, yang bisa sangat berguna untuk debugging.

Praktik dan Pertimbangan Terbaik

Saat bekerja dengan HOCs, ingat tips berikut:

  1. Jangan Mengubah Komponen Asli: Selalu komposisi komponen asli dengan fungtionalitas baru.
  2. Lewati Props Tak Terkait: Pastikan untuk lewatkan prop yang tidak spesifik ke HOC.
  3. Maksimalkan Komposabilitas: HOCs harus dapat dijejer dengan HOC lain.
  4. Bungkus Nama Display untuk Debugging Mudah: Gunakan React.displayName untuk memberi HOC Anda nama yang jelas di React DevTools.

Berikut adalah tabel yang menggabungkan beberapa pola HOC umum:

Pola Deskripsi Contoh Kasus Penggunaan
Props Proxy Manipulasi prop Menambah/mengubah prop
Inheritance Inversion Mengextend lifecycle komponen Menambahkan logging ke method lifecycle
Render Highjacking Mengontrol output render Rendering bersyarat
State Abstraction Mengelola dan menyediakan state Mengambil dan menyediakan data

Ingat, Higher-Order Components adalah alat kuat di dalam kotak alat React Anda, tetapi mereka tidak selalu solusi terbaik. Dengan pengenalan Hooks di React, beberapa kasus penggunaan HOCs dapat diselesaikan lebih elegan dengan hooks khusus. Selalu pertimbangkan kebutuhan khusus aplikasi Anda saat memutuskan untuk menggunakan HOCs, hooks, atau pola lainnya.

Dan itu saja, teman-teman! Anda baru saja mengambil langkah pertama ke dunia Higher-Order Components di React. Latih konsep ini, eksperimen dengan HOC Anda sendiri, dan segera Anda akan menjejer komponen seperti maestro mengarahan orkestra. Selamat coding!

Credits: Image by storyset