Aujourd'hui, nous allons voir comment créer une pagination de toutes pièces et la rendre accessible et réutilisable. J'espère que cela vous aidera et laissez-moi vos commentaires à la fin du post !
Github : https://github.com/micaavigliano/accessible-pagination
Projet : https://accessible-pagination.vercel.app/
const useFetch = <T,>(url: string, currentPage: number = 0, pageSize: number = 20) => { const [data, setData] = useState<T | null>(null); const [loading, setLoading] = useState<boolean>(true); const [error, setError] = useState<boolean>(false); useEffect(() => { const fetchData = async() => { setLoading(true); setError(false); try { const response = await fetch(url); if (!response.ok) { throw new Error('network response failed') } const result: T = await response.json() as T; setData(result) } catch (error) { setError(true) } finally { setLoading(false); } }; fetchData() }, [url, currentPage, pageSize]); return { data, loading, error, } };
Pour qu'une page soit accessible nous devons prendre en compte les points suivants :
aria-pointset est utilisé pour calculer la position de l'élément parmi tous les éléments de la page. Le lecteur d'écran l'annoncera comme suit :
Pour y arriver, nous allons le coder comme suit :
const useFetch = <T,>(url: string, currentPage: number = 0, pageSize: number = 20) => { const [data, setData] = useState<T | null>(null); const [loading, setLoading] = useState<boolean>(true); const [error, setError] = useState<boolean>(false); useEffect(() => { const fetchData = async() => { setLoading(true); setError(false); try { const response = await fetch(url); if (!response.ok) { throw new Error('network response failed') } const result: T = await response.json() as T; setData(result) } catch (error) { setError(true) } finally { setLoading(false); } }; fetchData() }, [url, currentPage, pageSize]); return { data, loading, error, } };
Lorsque la page cesse de se charger, nous définirons un nouveau message avec notre page actuelle et la longueur du nouveau tableau que nous chargeons.
Maintenant oui ! Voyons comment le code est structuré dans le fichier pagination.tsx
Le composant nécessitera cinq accessoires
const [statusMessage, setStatusMessage] = useState<string>(""); useEffect(() => { window.scrollTo({ top: 0, behavior: 'smooth' }); if (!loading) { setStatusMessage(`Page ${currentPage} loaded. Displaying ${data?.near_earth_objects.length || 0} items.`); } }, [currentPage, loading]);
interface PaginationProps { currentPage: number; totalPages: number; nextPage: () => void; prevPage: () => void; goToPage: (page: number) => void; }
const handlePageChange = (newPage: number) => { setCurrentPage(newPage); }; const nextPage = () => { if (currentPage < totalPages) { handlePageChange(currentPage + 1); } };
const prevPage = () => { if (currentPage > 1) { handlePageChange(currentPage - 1); } };
Pour que notre pagination prenne vie, nous avons besoin d'une étape de plus, créer le tableau que nous allons itérer dans notre liste ! Pour cela nous devons suivre les étapes suivantes :
Ce tableau est celui que nous allons parcourir pour obtenir la liste des éléments de notre page comme suit :
const useFetch = <T,>(url: string, currentPage: number = 0, pageSize: number = 20) => { const [data, setData] = useState<T | null>(null); const [loading, setLoading] = useState<boolean>(true); const [error, setError] = useState<boolean>(false); useEffect(() => { const fetchData = async() => { setLoading(true); setError(false); try { const response = await fetch(url); if (!response.ok) { throw new Error('network response failed') } const result: T = await response.json() as T; setData(result) } catch (error) { setError(true) } finally { setLoading(false); } }; fetchData() }, [url, currentPage, pageSize]); return { data, loading, error, } };
Et voici comment réaliser une pagination réutilisable et accessible ! Personnellement, j'ai appris à créer une page à partir de zéro car j'ai dû l'implémenter en live coding. J'espère que mon expérience vous sera utile pour votre carrière et que vous pourrez l'implémenter et même l'améliorer !
Salutations,
Mica<3
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!