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!
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:
-
Kita mendefinisikan HOC
withDataFetching
. Itu menerima dua parameter: komponen yang kita ingin wrap (WrappedComponent
) dan URL untuk mengambil data (dataSource
). -
Dalam
withDataFetching
, kita membuat dan mengembalikan komponen functional baru. Komponen ini menggunakan hook React untuk mengelola state dan efek samping. -
Kita menggunakan
useState
untuk mengelola statedata
,loading
, danerror
. -
Kita menggunakan
useEffect
untuk mengambil data saat komponen dimuat. Setelah data diambil, kita memperbarui state sesuainya. -
Bergantung pada state, kita menampilkan pesan loading, pesan error, atau merender
WrappedComponent
dengan data yang diambil. -
Kita membuat komponen sederhana
UserList
yang diharapkan menerima data sebagai prop dan merender itu. -
Kita gunakan HOC untuk membuat komponen baru
UserListWithData
yang memiliki kemampuan pengambilan data. -
Akhirnya, kita gunakan
UserListWithData
di komponenApp
.
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:
- Jangan Mengubah Komponen Asli: Selalu komposisi komponen asli dengan fungtionalitas baru.
- Lewati Props Tak Terkait: Pastikan untuk lewatkan prop yang tidak spesifik ke HOC.
- Maksimalkan Komposabilitas: HOCs harus dapat dijejer dengan HOC lain.
-
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