Diferencia elementos React, nodos y componentes, y explica cómo fragments y composición permiten construir árboles de interfaz sin wrappers innecesarios.
Última actualización
Actualizada
Nivel
Fundamentos
Un elemento de React es una descripción inmutable de una parte de la interfaz. Los componentes producen elementos; React combina esos elementos en un árbol; los fragments permiten agruparlos sin introducir un nodo DOM innecesario.
Cuando escribes JSX no estás creando directamente nodos del DOM. Estás construyendo valores que describen qué quieres renderizar.
TypeScript
const title =<h1>Productos</h1>;
title contiene un elemento de React. Conceptualmente incluye información como:
El tipo que debe renderizarse: h1.
Las props asociadas.
Los hijos.
La key, cuando existe.
React utiliza esa descripción durante el render para construir el siguiente árbol de interfaz. Más adelante, durante el commit, React DOM aplica al navegador únicamente los cambios necesarios.
Texto
JSX
↓
elementos de React
↓
árbol calculado durante render
↓
reconciliación con el árbol anterior
↓
commit sobre el DOM
Una interfaz declarativa necesita una representación intermedia. Si cada componente modificara el DOM directamente, React no podría comparar el resultado anterior con el siguiente ni coordinar actualizaciones entre componentes.
Los elementos permiten separar dos fases:
Describir: el componente calcula qué debería existir.
Aplicar: React decide cómo actualizar el entorno real.
Por eso ejecutar un componente no equivale a insertar HTML inmediatamente.
TypeScript
functionProductTitle({ name }:{ name:string}){return<h2>{name}</h2>;}
La función devuelve una descripción. React conserva el control sobre cuándo ejecutarla, cómo relacionarla con renders anteriores y qué cambio termina llegando al DOM.
Es la entidad real creada en el navegador, como un HTMLElement.
Texto
<Header />
↓ elemento cuyo tipo es Header
Header()
↓ devuelve <header>
Elemento host
↓ commit de React DOM
HTMLElement real
Un elemento de React es ligero y descriptivo. No expone APIs como focus(), getBoundingClientRect() o addEventListener(). Para interactuar con un nodo real utilizas refs o APIs del navegador en el momento apropiado.
La forma corta sirve para la mayoría de agrupaciones:
TypeScript
<><Header /><MainContent /></>
La forma explícita permite pasar una key:
TypeScript
import{ Fragment }from"react";functionGlossary({ entries }:{ entries: Entry[]}){return(<dl>{entries.map((entry)=>(<Fragment key={entry.id}><dt>{entry.term}</dt><dd>{entry.definition}</dd></Fragment>))}</dl>);}
La key identifica el grupo completo formado por dt y dd. No puedes escribir key en <>...</>.
Las APIs experimentales o Canary relacionadas con refs de fragments no deben tratarse como comportamiento estable general. Para código estable, piensa principalmente en fragments como agrupaciones sin nodo DOM y con soporte de key en su forma explícita.
Este componente no aporta necesariamente una frontera útil:
TypeScript
functionProductName({ children }:{ children: React.ReactNode }){return<span>{children}</span>;}
Puede tener sentido si forma parte de un design system, añade estilos consistentes, semántica o comportamiento. Sin eso, solo introduce navegación adicional entre archivos.
Extrae un componente cuando exista una responsabilidad, una interacción, una API o una razón real de reutilización.
Los fragments dentro de arrays necesitan una key estable igual que cualquier otro grupo. Sin ella, React no puede relacionar correctamente cada grupo entre renders.
Un fragment estable no ofrece, en el canal estable general, un nodo DOM tradicional al que aplicar clases, estilos o APIs como focus(). Si necesitas una superficie real para layout, medición o semántica, utiliza un elemento apropiado.
Antes de eliminarlo, comprueba si era hijo directo de Grid o Flexbox, si definía un stacking context, si controlaba overflow o si aportaba semántica accesible.
Renderizado condicional explica cómo un componente produce árboles diferentes según el estado actual y qué ocurre con la identidad de las ramas que aparecen o desaparecen.