JSX a fondo
💡 🎯 Al terminar esta lección podrás…
- Explicar qué es JSX y en qué se convierte.
- Aplicar las diferencias entre JSX y HTML.
- Insertar expresiones de JavaScript con llaves, en texto y en atributos.
- Dar estilos con objetos y usar fragmentos.
1.JSX es JavaScript con etiquetas
JSX te permite escribir etiquetas parecidas a HTML dentro de JavaScript. No es HTML ni un texto que se pega en la página: una herramienta (Vite, Babel) lo traduce a llamadas normales de JavaScript antes de que el navegador lo ejecute.
const saludo = <h1 className="titulo">Hola, React</h1>;
const saludo = React.createElement(
"h1",
{ className: "titulo" },
"Hola, React"
);
Ambas versiones producen exactamente lo mismo. JSX existe porque es mucho más cómodo de leer y escribir, y porque deja el marcado y la lógica de cada pieza en el mismo lugar.
📌 Nota · JSX es opcional, pero universal
Técnicamente podrías usar React sin JSX. En la práctica casi todo el mundo lo usa, así que es lo que aprenderás aquí.
2.Diferencias con HTML
JSX se ve como HTML, pero sigue las reglas de JavaScript. Estas son las diferencias que más te encontrarás:
| Tema | En HTML | En JSX |
|---|---|---|
| Clases CSS | class="caja" | className="caja" (porque class es palabra reservada) |
Etiqueta for | <label for="correo"> | <label htmlFor="correo"> |
| Atributos compuestos | tabindex, maxlength, onclick | tabIndex, maxLength, onClick (camelCase) |
| Etiquetas vacías | <br>, <img>, <input> | <br />, <img />, <input /> (siempre se cierran) |
| Estilos en línea | style="color: red" | style={{ color: "red" }} (un objeto) |
| Comentarios | <!-- nota --> | {/* nota */} |
| Varios elementos | Pueden ser hermanos | Necesitan un solo elemento raíz o un fragmento <>…</> |
💡 Consejo · Si olvidas una regla
No te preocupes por memorizarlas todas: la consola te avisa. Por ejemplo, si escribes class, React muestra una advertencia que te dice exactamente que debes usar className. Prueba a cambiarlo en el editor de arriba.
3.Llaves { }: JavaScript dentro del JSX
Las llaves son la puerta entre JSX y JavaScript. Todo lo que escribas entre { } se evalúa como una expresión de JavaScript y su resultado se inserta en la pantalla.
Puedes poner dentro de { } | No puedes poner |
|---|---|
Variables y propiedades: {nombre}, {usuario.edad} | Sentencias: if, for, while |
Operaciones y llamadas: {a + b}, {texto.trim()} | Declaraciones: const x = 1 |
Ternarios: {activo ? "Sí" : "No"} | Objetos directos para mostrar: {usuario} (da error) |
Expresiones con &&, map, filter… | — |
⚠️ Importante · Qué se puede «dibujar»
React muestra texto y números; ignora true, false, null y undefined (no dibuja nada). Pero un objeto como { a: 1 } provoca un error, porque no sabe cómo convertirlo en pantalla. Muestra sus propiedades: {usuario.nombre}.
📌 Nota · El caso del 0
Cuidado con {lista.length && <Lista />}: si la longitud es 0, React dibuja un 0. Es una trampa muy común; en la lección 5 verás cómo evitarla.
4.Atributos dinámicos y estilos
Las llaves también sirven en los atributos. Fíjate: con comillas pasas un texto fijo; con llaves, el resultado de una expresión.
<img src="logo.png" alt="Logo" /> // texto fijo, con comillas
<img src={usuario.foto} alt={usuario.nombre} /> // valor calculado, con llaves
📌 Nota · ¿Por qué style={{ … }} lleva dos llaves?
La llave exterior abre «JavaScript dentro de JSX». La interior es el objeto { color: "red" } que le pasas. Las propiedades CSS van en camelCase (backgroundColor, no background-color) y los números sin unidad se interpretan como píxeles.
5.Texto, espacios y fragmentos
- Los saltos de línea del JSX no se muestran: JSX recorta los espacios al inicio y al final de cada línea. Para un salto visible usa
<br />o párrafos. - Para un espacio entre una expresión y otro texto en la misma línea basta con escribirlo:
Hola, {nombre}!. - Las comillas y símbolos
<,>,{,}en el texto: si necesitas mostrar llaves, ponlas dentro de una cadena:{"{ hola }"}. - Fragmentos con clave:
<Fragment key={id}>…</Fragment>cuando necesitas una clave (lección 5).
6.Buenas prácticas de escritura
- Paréntesis tras
returncuando el JSX ocupa varias líneas:return ( … );. - Una sola cosa por componente: si el JSX crece demasiado, divídelo en componentes.
- Cálculos antes del
return: haz las operaciones en variables y deja el JSX limpio. - Nombres claros:
usuarioActivoexplica más quex. - Indenta de forma consistente (2 espacios): JSX anidado sin sangría es ilegible.
- Evita lógica larga dentro de las llaves: si no cabe en una línea, extráela a una variable o función.
// ❌ Difícil de leer
return <p>{usuario.puntos > 100 ? "Experto" : usuario.puntos > 50 ? "Avanzado" : "Novato"}</p>;
// ✅ Cálculo fuera, JSX limpio
let nivel = "Novato";
if (usuario.puntos > 100) nivel = "Experto";
else if (usuario.puntos > 50) nivel = "Avanzado";
return <p>{nivel}</p>;
7.Errores frecuentes
- Usar
classofor: React avisa en la consola; cámbialos porclassNameyhtmlFor. - Olvidar cerrar
<input>,<img>o<br>: en JSX deben ser<input />. - Escribir
style="color: red": elstylerecibe un objeto:style={{ color: "red" }}. - Intentar mostrar un objeto:
{usuario}da error; muestra{usuario.nombre}. - Poner un
ifdentro de las llaves: solo se permiten expresiones; usa un ternario o calcula antes. - Comentar con
//dentro del JSX: aparece como texto. Usa{/* … */}. - Atributos en minúscula como
onclick: usaonClick.
📒 Apuntes para llevar
- JSX es JavaScript con etiquetas; una herramienta lo traduce a
React.createElement(...). - Diferencias con HTML:
className,htmlFor, atributos en camelCase, etiquetas siempre cerradas ystylecomo objeto. - Un componente devuelve un solo elemento raíz o un fragmento
<>…</>. - Las llaves
{ }insertan expresiones de JavaScript (no sentencias). - React no dibuja
true,false,nullniundefined; los objetos dan error; el0sí se dibuja. - Las llaves también se usan en atributos:
src={foto},disabled={!activo}. - Los comentarios en JSX son
{/* … */}.
8.Glosario
| Término | Significado |
|---|---|
| JSX | Extensión de sintaxis de JavaScript que permite escribir etiquetas dentro del código. |
| Expresión | Código que produce un valor: a + b, nombre.trim(), activo ? 1 : 2. |
| Fragmento | <>…</>: agrupa elementos sin crear un nodo extra en el DOM. |
| camelCase | Convención de nombres con mayúscula en cada palabra interna: onClick, tabIndex. |
className | Atributo de JSX equivalente al class de HTML. |
htmlFor | Atributo de JSX equivalente al for de HTML en un <label>. |
| Transpilar | Traducir código de una sintaxis a otra (JSX → JavaScript). |
🧠 Comprueba lo aprendido
Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.
¿Cómo se escribe el atributo class en JSX?
class es una palabra reservada de JavaScript; JSX usa className.
¿Cuál es la forma correcta de aplicar un estilo?
Se pasa un objeto: las llaves exteriores son de JSX y las interiores del objeto.
¿Qué hace React con {false}?
Los valores booleanos, null y undefined no se dibujan.
¿Qué NO se puede escribir dentro de las llaves de JSX?
Dentro de las llaves solo caben expresiones. Para decidir, usa un ternario o calcula antes del return.
¿Cómo se escribe un comentario dentro del JSX?
Los comentarios van entre llaves con la sintaxis de comentario de JavaScript.
Tu progreso se guarda en este navegador y se refleja en el índice del curso.
💡 🚀 ¡Ahora te toca!
La práctica fija lo aprendido. Pasa al ejercicio de esta lección.