Render dinámico: pintar listas y tarjetas desde datos
Aprende a transformar arrays en UI real de forma mantenible: plantillas de render, estados de carga/vacío/error, actualización incremental y prevención de problemas comunes.
Render dinámico significa generar la interfaz a partir de datos, no escribir HTML fijo para cada caso.
El patrón es simple: estado -> función de render -> DOM. Lo difícil es mantener claridad cuando hay filtros, orden, errores y actualizaciones frecuentes.
Si diseñas bien el render desde el inicio, tu UI escala mejor y el código es más fácil de probar y depurar.
Objetivo de esta lección: construir renderizados limpios, eficientes y seguros para listas y tarjetas reales.
- No manipules nodos sueltos sin estrategia: renderiza desde datos fuente claros.
- Cuando el estado cambia (filtro, búsqueda, alta, borrado), la interfaz debe reflejar ese estado de forma determinista.
- Evita mezclar lógica de datos con estilos/DOM en un único bloque largo; separa transformación, plantilla y pintado para ganar legibilidad.
- Para listados sencillos, este patrón es rápido y legible.
- Define una función que reciba datos y devuelva una cadena HTML con `map().join('')`.
Mentalidad de render: la UI es una proyección del estado
No manipules nodos sueltos sin estrategia: renderiza desde datos fuente claros.
Cuando el estado cambia (filtro, búsqueda, alta, borrado), la interfaz debe reflejar ese estado de forma determinista.
Evita mezclar lógica de datos con estilos/DOM en un único bloque largo; separa transformación, plantilla y pintado para ganar legibilidad.
Patrón base para listas con map + join
Para listados sencillos, este patrón es rápido y legible.
Define una función que reciba datos y devuelva una cadena HTML con `map().join('')`.
Después, asigna una sola vez el resultado al contenedor. Evita concatenar `innerHTML` dentro de bucles.
- No repitas `container.innerHTML += ...` en cada iteración.
- Mantén plantilla HTML en función separada para testear y reutilizar.
- Incluye `data-id` si luego habrá interacciones (editar/borrar).
- Si hay riesgo de texto usuario, usa `textContent` o sanitización.
Estados de UI: loading, vacío y error
Una lista robusta no solo muestra éxito: también gestiona ausencia de datos y fallos.
Antes de pintar resultados, define qué verá la persona usuaria cuando no haya elementos o cuando falle una carga.
Estos estados deben ser parte de tu función de render, no parches añadidos al final.
Rendimiento básico: render por lotes y fragmentos
Cuando hay muchos nodos, minimiza escrituras repetidas sobre el DOM.
`DocumentFragment` permite construir nodos en memoria y anexarlos de una sola vez al contenedor.
Esto reduce reflows/repaints innecesarios y mejora la percepción de fluidez en listados grandes.
- Agrupa cambios antes de tocar el DOM real.
- Usa `replaceChildren` para limpiar y renderizar en un paso.
- Evita recalcular selectores dentro de bucles intensivos.
- Mide con DevTools si el listado crece mucho.
Checklist de render mantenible
Con estas reglas, tu render será más predecible y fácil de escalar.
El mejor render no es el más corto, sino el que deja claro qué entra, qué sale y cómo evoluciona ante cambios de estado.
Antes de cerrar, revisa seguridad (contenido), experiencia (estados) y evolución (reutilización).
- Función de render separada de la lógica de datos.
- Estados de loading/vacío/error contemplados.
- Interacciones preparadas con data-attributes.
- Actualizaciones de DOM agrupadas para evitar parpadeo y coste extra.