Yo developers! Kali ini kita bakal ngoding sesuatu yang super kece – infinite scroll yang bikin app kita jadi smooth banget. Gak perlu pusing-pusing pencet tombol “Load More” lagi!
๐ฏ Kenapa Sih Infinite Scroll?
Bayangin aja sob, lu lagi scrolling Instagram atau Twitter. Notice gak kalau kontennya ke-load otomatis pas lu scroll ke bawah? Nah itu dia yang namanya infinite scroll!
Keuntungannya apa aja?
- ๐ UX jadi lebih smooth dan natural
- ๐ฑ Perfect buat mobile experience
- ๐ฎ Bikin user lebih engaged sama konten
- ๐ช Load data lebih efisien (load waktu dibutuhin aja)
๐ง Intersection Observer – The Secret Sauce
Intersection Observer itu kayak mata-mata yang ngawasin elemen kita. Dia bakal ngasih tau kapan elemen kita keliatan di viewport. Keren kan?
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
// Waktunya load data baru guys!
}
});
});
๐ป Let’s Code This Bad Boy!
1. Setup Project
First things first, bikin project React baru:
npx create-react-app infinite-scroll-app
cd infinite-scroll-app
npm install axios
2. Bikin Custom Hook
// useInfiniteScroll.js
import { useEffect, useRef, useState } from 'react';
const useInfiniteScroll = (callback) => {
const observerRef = useRef(null);
const [isLoading, setIsLoading] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver(
async (entries) => {
if (entries[0].isIntersecting && !isLoading) {
setIsLoading(true);
await callback();
setIsLoading(false);
}
},
{ threshold: 1.0 }
);
if (observerRef.current) {
observer.observe(observerRef.current);
}
return () => observer.disconnect();
}, [callback, isLoading]);
return { observerRef, isLoading };
};
export default useInfiniteScroll;
3. Component Implementation
// App.js
import React, { useState, useCallback } from 'react';
import useInfiniteScroll from './useInfiniteScroll';
import axios from 'axios';
const App = () => {
const [items, setItems] = useState([]);
const [page, setPage] = useState(1);
const loadMore = useCallback(async () => {
try {
// Contoh pake API dummy
const response = await axios.get(
`https://api.example.com/posts?page=${page}`
);
setItems(prev => [...prev, ...response.data]);
setPage(prev => prev + 1);
} catch (error) {
console.error('Waduh error nih bro:', error);
}
}, [page]);
const { observerRef, isLoading } = useInfiniteScroll(loadMore);
return (
๐ฅ Infinite Scroll Demo
{items.map(item => (
{item.title}{item.description}
))}
{isLoading && 'โก Loading more items...'}
);
};
4. Styling Biar Kece
/* styles.css */
.app {
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
.card {
padding: 20px;
margin: 10px 0;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
background: white;
}
๐ฎ Tips & Tricks
Error Handling yang Proper
const loadMore = useCallback(async () => {
try {
if (hasMore) { // Flag buat cek masih ada data atau ngga
const response = await fetchData(page);
if (response.data.length === 0) {
setHasMore(false);
return;
}
// Process data
}
} catch (error) {
setError('Waduh error nih bro!');
// Handle error state
}
}, [page, hasMore]);
Performance Tips ๐
- Pake `useCallback` buat prevent unnecessary re-renders
- Implement debouncing buat scroll events
- Lazy load images pake `loading=”lazy”`
- Optimize render list pake `React.memo()`
๐ฏ Edge Cases yang Perlu Dihandle
- 1. No Internet Connection
- 2. API Error
- 3. Empty Data
- 4. Loading States
- 5. Duplicate Data Prevention
๐ Debugging Tips
// Debug helper
useEffect(() => {
console.log('Current items:', items);
console.log('Loading state:', isLoading);
console.log('Page:', page);
}, [items, isLoading, page]);
๐ Kesimpulan
Infinite scroll itu game changer buat UX modern apps. Dengan Intersection Observer, implementasinya jadi jauh lebih clean dan efficient dibanding scroll event listener biasa.
Use Cases yang Cocok:
- Social media feeds
- Product listings
- Image galleries
- News articles
- Search results
Alternatives:
- “Load More” button (buat content yang butuh lebih manual control)
- Pagination (buat data yang structured/numbered)
๐ Resources
Nah, itu dia tutorial implementasi infinite scroll yang super kece! Kalau ada yang masih bingung atau mau diskusi lebih lanjut, gas aja reply! Happy coding! ๐