Render Props y Composición en React: Ventajas y Desventajas

Clase 2 de 31Curso de React Avanzado

Resumen

Aprende a crear componentes flexibles y mantenibles en React con los patrones render props y composition. Verás cómo un componente padre delega el “cómo se pinta” al hijo mediante una función, maximizando la reutilización de lógica y reduciendo código, con tipado sólido en TypeScript. Además, se explican ventajas, desventajas y cómo evitar errores comunes como el prop drilling.

¿Qué es render props y por qué mejora la reutilización?

El patrón render props consiste en pasar una función como prop para decidir el renderizado. Así, el padre controla la salida visual y el hijo solo expone datos o estado. Este enfoque aporta flexibilidad, mantenibilidad y reutilización al separar la lógica del diseño.

¿Cómo funciona el primer ejemplo con función render?

  • Dos componentes: parent component y child component.
  • El hijo recibe una prop función llamada render que retorna un elemento JSX.
  • El hijo define un nombre, por ejemplo, "DevCode", y llama a render(nombre).
  • El padre decide el marcado: por ejemplo, un párrafo con “Hello, nombre”.

Fragmento de tipado y uso en TypeScript:

// Child type ChildComponentProps = { render: (name: string) => JSX.Element; }; const ChildComponent: React.FC<ChildComponentProps> = ({ render }) => { const name = 'DevCode'; return <div>{render(name)}</div>; }; // Parent const ParentComponent: React.FC = () => ( <ChildComponent render={(name) => <p>Hello, {name}</p>} /> );

¿Qué aporta el tipado de TypeScript en las props?

  • Define la forma exacta de la función: parámetros y retorno.
  • Evita errores en tiempo de desarrollo y facilita el autocompletado.
  • Mejora la comunicación dentro del equipo al documentar contratos.

¿Cómo aplicar render props para listas con data del padre?

Se crea la lógica en el padre: una función render que recibe un arreglo de strings y retorna nodos de React. El padre mantiene la data en un estado local con useState, y el hijo únicamente la pinta con un map dentro de elementos LI.

¿Cómo tipar las props con TypeScript en padre e hijo?

  • El padre expone una interfaz con la firma de la función render.
  • El hijo declara una interfaz con la prop data: string[] y la recorre.

Fragmentos clave:

// Parent interface ParentComponentProps { render: (data: string[]) => React.ReactNode; } const ParentComponent: React.FC<ParentComponentProps> = ({ render }) => { const [data] = React.useState<string[]>(/* array de strings */); return <ul>{render(data)}</ul>; }; // Child interface ChildComponentProps { data: string[]; } const ChildComponent: React.FC<ChildComponentProps> = ({ data }) => ( <> {data.map((item, index) => ( <li key={index}>{item}</li> ))} </> );

¿Qué sucede al integrar el parent component en la UI?

  • Se importa el parent component y el child component en la vista.
  • Se pasa la función render del padre que delega el renderizado al hijo.

Uso de integración:

<ParentComponent render={(data: string[]) => <ChildComponent data={data} />} />
  • Resultado: el padre controla la lógica y el hijo se encarga del pintado de la lista dentro de un UL.
  • Preparación del entorno: clonar el repositorio, ejecutar npm install, luego npm run dev y abrir el localhost.

¿Cuáles son ventajas, desventajas y relación con composition?

El patrón render props convive muy bien con composition: construir interfaces complejas desde componentes pequeños que se combinan. En los ejemplos, el padre define la estructura y el hijo se especializa en pintar datos.

  • Ventajas.
    • Reutilización de lógica sin duplicar componentes.
    • Mantenibilidad y flexibilidad al separar responsabilidades.
    • Tipado con TypeScript que reduce errores.
  • Desventajas.
    • Riesgo de prop drilling si la función o datos viajan por múltiples niveles.
    • Curva de aprendizaje más exigente para personas nuevas en React.
  • Habilidades y keywords trabajadas.
    • Definir interfaces y types de props en TypeScript.
    • Usar React.FC con genéricos para tipar componentes.
    • Implementar funciones render que retornan JSX.Element o ReactNode.
    • Mapear arreglos a elementos LI con key estable.
    • Aplicar composition para escalar la UI.

¿Qué casos de uso ves para aplicar el patrón de render props en tus componentes? Comparte tus ideas y dudas en los comentarios.

      Render Props y Composición en React: Ventajas y Desventajas