Skip to content

3. Fundamentos de React (JSX)

JSX (JavaScript XML) es una extensión de sintaxis para JavaScript que permite escribir código similar a HTML dentro de archivos JavaScript. No es HTML real, sino una forma más intuitiva de crear elementos de React.

CaracterísticaDescripción
NombreJavaScript XML
PropósitoEscribir UI de forma declarativa
CompilaciónSe transforma a JavaScript puro
ObligatorioNo, pero muy recomendado
Comparación JSX vs JavaScript
// Sin JSX - JavaScript puro (difícil de leer)
const elemento = React.createElement(
'div',
{ className: 'contenedor' },
React.createElement('h1', null, 'Hola'),
React.createElement('p', null, 'Bienvenido')
);
// Con JSX - Mucho más legible
const elemento = (
<div className="contenedor">
<h1>Hola</h1>
<p>Bienvenido</p>
</div>
);
  • Legibilidad: Parece HTML, fácil de entender
  • Productividad: Escribes menos código
  • Errores claros: El compilador detecta errores de sintaxis
  • Expresividad: Combinas lógica y UI en un solo lugar

Elementos básicos
// Elemento simple
const titulo = <h1>Hola Mundo</h1>;
// Elemento con atributos
const imagen = <img src="foto.jpg" alt="Mi foto" />;
// Elemento con clase CSS (usa className, no class)
const caja = <div className="caja">Contenido</div>;
Elementos anidados
// Elementos anidados
const tarjeta = (
<div className="tarjeta">
<h2>Título</h2>
<p>Descripción del contenido</p>
<button>Ver más</button>
</div>
);
Componentes en JSX
// Definir un componente
function Saludo() {
return <h1>¡Hola!</h1>;
}
// Usar el componente (como una etiqueta HTML)
const app = (
<div>
<Saludo />
<Saludo />
<Saludo />
</div>
);
HTMLJSXRazón
classclassNameclass es palabra reservada en JS
forhtmlForfor es palabra reservada en JS
onclickonClickcamelCase en JSX
tabindextabIndexcamelCase en JSX
Atributos en JSX
// Atributos en JSX
<label htmlFor="email">Email:</label>
<input
id="email"
className="input-field"
type="email"
placeholder="tu@email.com"
onChange={handleChange}
/>

Todo JSX debe tener un único elemento raíz que envuelva todo el contenido.

Un solo elemento padre
// ❌ MAL - Múltiples elementos raíz
function Componente() {
return (
<h1>Título</h1>
<p>Párrafo</p>
);
}
// ✅ BIEN - Un solo elemento padre
function Componente() {
return (
<div>
<h1>Título</h1>
<p>Párrafo</p>
</div>
);
}

En JSX, todas las etiquetas deben cerrarse, incluso las que en HTML no lo requieren.

Cerrar etiquetas
// ❌ MAL - Etiquetas sin cerrar
<img src="foto.jpg">
<input type="text">
<br>
// ✅ BIEN - Etiquetas cerradas
<img src="foto.jpg" />
<input type="text" />
<br />

Los atributos con guiones o minúsculas se escriben en camelCase.

camelCase en atributos
// ❌ MAL - Atributos en minúsculas/guiones
<div class="caja" onclick={click} tabindex="1">
// ✅ BIEN - camelCase
<div className="caja" onClick={click} tabIndex="1">

Regla 4: Expresiones JavaScript entre llaves

Section titled “Regla 4: Expresiones JavaScript entre llaves”

Para incluir JavaScript dentro de JSX, usa llaves {}.

Expresiones en JSX
const nombre = "Ana";
const edad = 25;
// Usar variables
<p>Hola, {nombre}</p>
// Usar expresiones
<p>Edad: {edad} años</p>
<p>Año de nacimiento: {2024 - edad}</p>
// Usar funciones
<p>Nombre en mayúsculas: {nombre.toUpperCase()}</p>

Variables en JSX
function Perfil() {
const nombre = "Carlos";
const profesion = "Desarrollador";
const experiencia = 5;
return (
<div>
<h1>{nombre}</h1>
<p>Profesión: {profesion}</p>
<p>Experiencia: {experiencia} años</p>
<p>Nivel: {experiencia > 3 ? "Senior" : "Junior"}</p>
</div>
);
}
Funciones en JSX
function formatearFecha(fecha) {
return fecha.toLocaleDateString('es-ES');
}
function formatearPrecio(precio) {
return '$' + precio.toFixed(2);
}
function Producto() {
const fecha = new Date();
const precio = 99.5;
return (
<div>
<p>Fecha: {formatearFecha(fecha)}</p>
<p>Precio: {formatearPrecio(precio)}</p>
</div>
);
}
Operaciones matemáticas
function Calculadora() {
const a = 10;
const b = 5;
return (
<div>
<p>Suma: {a + b}</p>
<p>Resta: {a - b}</p>
<p>Multiplicación: {a * b}</p>
<p>División: {a / b}</p>
<p>Potencia: {Math.pow(a, 2)}</p>
</div>
);
}
Métodos de arrays y strings
function Lista() {
const frutas = ["Manzana", "Banana", "Naranja"];
const texto = "hola mundo";
return (
<div>
{/* Métodos de string */}
<p>Mayúsculas: {texto.toUpperCase()}</p>
<p>Longitud: {texto.length} caracteres</p>
{/* Métodos de array */}
<p>Total frutas: {frutas.length}</p>
<p>Primera: {frutas[0]}</p>
<p>Unidas: {frutas.join(", ")}</p>
</div>
);
}

Las llaves {} permiten “escapar” de JSX a JavaScript. Úsalas para:

UsoEjemplo
Variables{nombre}
Expresiones{2 + 2}
Funciones{calcular()}
Ternarios{activo ? "Sí" : "No"}
Objetos en estilosstyle={{color: "red"}}
Uso de llaves
function Ejemplo() {
const usuario = "María";
const puntos = 150;
const activo = true;
return (
<div>
{/* Variable simple */}
<h1>Hola, {usuario}</h1>
{/* Expresión matemática */}
<p>Puntos dobles: {puntos * 2}</p>
{/* Operador ternario */}
<p>Estado: {activo ? "Activo" : "Inactivo"}</p>
{/* Método de string */}
<p>Usuario: {usuario.toLowerCase()}</p>
{/* Estilos inline (doble llave) */}
<p style={{ color: "blue", fontSize: "20px" }}>
Texto con estilo
</p>
</div>
);
}
Doble llave para estilos
// Los estilos inline requieren doble llave
// Primera llave: entrar a JavaScript
// Segunda llave: definir el objeto
// ❌ MAL
<div style="color: red">
// ✅ BIEN
<div style={{ color: "red" }}>
// Ejemplo completo
<div style={{
backgroundColor: "#f0f0f0",
padding: "20px",
borderRadius: "8px",
boxShadow: "0 2px 4px rgba(0,0,0,0.1)"
}}>
Contenido con estilos
</div>
Limitaciones de las llaves
// ❌ NO puedes usar sentencias (if, for, while)
<div>
{if (activo) { return "" }} // Error
</div>
// ✅ Usa operador ternario en su lugar
<div>
{activo ? "" : "No"}
</div>
// ❌ NO puedes usar declaraciones
<div>
{const x = 5} // Error
</div>
// ✅ Declara fuera del JSX
const x = 5;
<div>{x}</div>

Los Fragmentos (<Fragment> o <>) permiten agrupar elementos sin agregar un nodo extra al DOM. Son útiles cuando no quieres un <div> contenedor.

Problema sin fragmentos
// Sin fragmentos - agrega un div innecesario al DOM
function Lista() {
return (
<div> {/* Este div aparece en el HTML final */}
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</div>
);
}
// Resultado en el DOM:
// <div>
// <li>Item 1</li>
// <li>Item 2</li>
// <li>Item 3</li>
// </div>
Uso de Fragmentos
import { Fragment } from 'react';
// Opción 1: Fragment explícito
function Lista() {
return (
<Fragment>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</Fragment>
);
}
// Opción 2: Sintaxis corta (más común)
function Lista() {
return (
<>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</>
);
}
// Resultado en el DOM (sin div extra):
// <li>Item 1</li>
// <li>Item 2</li>
// <li>Item 3</li>
Casos de uso de Fragmentos
// Ejemplo 1: Retornar múltiples elementos de tabla
function FilaTabla() {
return (
<>
<td>Celda 1</td>
<td>Celda 2</td>
<td>Celda 3</td>
</>
);
}
// Ejemplo 2: Componente con múltiples elementos
function Encabezado() {
return (
<>
<h1>Título Principal</h1>
<p>Subtítulo descriptivo</p>
</>
);
}
// Ejemplo 3: Dentro de un map
function ListaItems({ items }) {
return (
<ul>
{items.map(item => (
<Fragment key={item.id}>
<li>{item.nombre}</li>
<li>{item.precio}</li>
</Fragment>
))}
</ul>
);
}

🐝