Compartir en Twitter
Go to Homepage

COMPONENTE DE PAGINACIÓN PERSONALIZADO EN REACT: TUTORIAL PRÁCTICO

August 3, 2025

Introducción al componente de paginación personalizado en React

Al desarrollar aplicaciones web modernas, es fundamental implementar un sistema de paginación que permita manejar grandes volúmenes de datos de forma eficiente y organizada. La paginación facilita la navegación y mejora la experiencia del usuario al evitar la sobrecarga de información en una sola vista.

Un componente de paginación personalizado en React es una solución que se adapta a las necesidades específicas de cada proyecto, permitiendo controlar la presentación y funcionalidad de la navegación entre páginas. Este componente muestra botones que representan cada página disponible y actualiza dinámicamente el contenido mostrado según la selección del usuario.

Para construir este componente, es necesario comprender algunos elementos clave: un array que representa las páginas, funciones que gestionan los eventos de clic para cambiar la página, y elementos JSX que reflejan el estado actual de la paginación.

A continuación, se presenta un enfoque práctico para crear un paginador personalizado que se ajuste a distintos escenarios, desde conjuntos de datos limitados hasta grandes volúmenes de información.

Estructura básica del paginador personalizado

El primer paso para implementar un paginador personalizado en React es definir la estructura del componente que contendrá la lógica y la interfaz de usuario. En este caso, se crea un archivo llamado Pagination.js que alberga el componente principal.

Este componente recibe tres propiedades esenciales: la página actual, el total de páginas y una función para manejar el cambio de página. Se genera un array con los números de página disponibles y se renderizan los controles de navegación, incluyendo botones para avanzar, retroceder y seleccionar páginas específicas.

import React from "react";

const Pagination = ({ currentPage, totalPages, onPageChange }) => {
    const pageNumbers = [];

    for (let i = 1; i <= totalPages; i++) {
        pageNumbers.push(i);
    }

    return (
        <nav className="pagination">
            <div className="pagination-info">
                <p>
                    Página {currentPage} de {totalPages}
                </p>
            </div>
            <div className="pagination-buttons">
                <button
                    disabled={currentPage === 1}
                    onClick={() => onPageChange(currentPage - 1)}
                >
                    Anterior
                </button>
                <button
                    disabled={currentPage === totalPages}
                    onClick={() => onPageChange(currentPage + 1)}
                >
                    Siguiente
                </button>
            </div>
            <ul className="pagination-list">
                {pageNumbers.map((page) => (
                    <li key={page}>
                        <a href="#" onClick={() => onPageChange(page)}>
                            {page}
                        </a>
                    </li>
                ))}
            </ul>
        </nav>
    );
};

export default Pagination;

Esta estructura básica permite mostrar la información de la página actual y los botones para navegar entre las páginas. La función onPageChange actualiza el estado del componente padre para reflejar la página seleccionada.

Implementación de controles de navegación

Los controles de paginación son esenciales para que el usuario pueda desplazarse entre las páginas de resultados. En este componente personalizado, se implementan botones para avanzar y retroceder, utilizando funciones que actualizan el estado de la paginación.

Estas funciones verifican que la página siguiente o anterior esté dentro del rango válido antes de actualizar el estado, garantizando una navegación fluida y sin errores.

const Pagination = ({ currentPage, totalPages, onChangePage }) => {
    const goToNextPage = () => {
        const nextPage = currentPage + 1;
        if (nextPage <= totalPages) {
            onChangePage(nextPage);
        }
    };

    const goToPrevPage = () => {
        const prevPage = currentPage - 1;
        if (prevPage >= 1) {
            onChangePage(prevPage);
        }
    };

    return (
        <div className="pagination">
            <button onClick={goToPrevPage}>&#60; Prev</button>
            <button onClick={goToNextPage}>Next &#62;</button>
        </div>
    );
};

Este diseño sencillo permite personalizar fácilmente los controles para adaptarlos a diferentes estilos y funcionalidades, manteniendo la usabilidad y accesibilidad.

Gestión del estado y cambio de página

Para que el componente de paginación funcione correctamente, es necesario que el componente padre gestione el estado de la página actual. Esto se logra utilizando el hook useState de React, que almacena y actualiza la página seleccionada.

import React, { useState } from "react";
import Pagination from "./Pagination";

function App() {
    const [currentPage, setCurrentPage] = useState(1);

    return (
        <div>
            <h1>Componente de Paginación Personalizado en React</h1>
            <Pagination
                currentPage={currentPage}
                onPageChange={setCurrentPage}
            />
        </div>
    );
}

export default App;

Dentro del componente de paginación, se utiliza la propiedad onPageChange para actualizar el estado cuando el usuario selecciona una página diferente. Esto permite que el componente se vuelva a renderizar mostrando la página activa.

import React from "react";

function Pagination({ currentPage, onPageChange }) {
    const pageNumbers = [1, 2, 3, 4, 5];

    const handleClick = (event, pageNumber) => {
        event.preventDefault();
        onPageChange(pageNumber);
    };

    return (
        <div>
            {pageNumbers.map((pageNumber) => (
                <a
                    key={pageNumber}
                    href="#"
                    className={pageNumber === currentPage ? "active" : ""}
                    onClick={(event) => handleClick(event, pageNumber)}
                >
                    {pageNumber}
                </a>
            ))}
        </div>
    );
}

export default Pagination;

Este enfoque permite una navegación intuitiva y dinámica, donde el usuario puede seleccionar directamente la página deseada y el contenido se actualiza en consecuencia.

Personalización visual del paginador

La apariencia del paginador es crucial para su integración en el diseño general de la aplicación. Se recomienda utilizar estilos CSS personalizados para adaptar los botones y controles a la identidad visual del proyecto.

En este caso, se optó por utilizar íconos de flecha para los botones de navegación, con colores que reflejan la paleta del sitio web, destacando la página activa con tonos azules y las inactivas con grises.

Además, se incorporó un cuadro de texto que permite al usuario ingresar directamente el número de página al que desea saltar, facilitando la navegación en conjuntos de datos extensos.

La personalización se logra mediante la asignación de clases CSS específicas a los elementos del componente, lo que permite modificar rápidamente estilos sin alterar la lógica del código.

Conclusiones

El desarrollo de un componente de paginación personalizado en React es una práctica esencial para manejar grandes volúmenes de datos de manera eficiente y mejorar la experiencia del usuario. A través de la gestión del estado, la implementación de controles de navegación intuitivos y la personalización visual, es posible crear un paginador que se adapte a las necesidades específicas de cualquier proyecto. Este enfoque flexible y escalable facilita la integración en aplicaciones modernas, optimizando la presentación y el acceso a la información.