Carlos Seijas
← Volver a los blogs

¿Qué es JSX? Guía completa de JavaScript XML en React

Código
JSXReactJavaScriptFrontendComponentesSintaxisDesarrollo
¿Qué es JSX? Guía completa de JavaScript XML en React

La primera vez que un desarrollador ve JSX, su reacción suele ser de confusión total: "¿Estoy escribiendo HTML dentro de JavaScript? ¿Esto no debería estar prohibido?" Es comprensible. Durante años nos dijeron que separáramos estructura, estilo y lógica, y de repente aparece React diciendo "mezcla todo, está bien". Pero hay una razón muy inteligente detrás de esta aparente locura, y cuando la entiendas, jamás querrás volver a crear interfaces de otra manera.

JSX: Rompiendo reglas por una buena causa

JSX significa "JavaScript XML" y es una extensión de sintaxis para JavaScript que te permite escribir elementos de interfaz de usuario de forma declarativa. En palabras simples: puedes escribir algo que parece HTML directamente en tu código JavaScript.

// Esto es JSX
const saludo = <h1>¡Hola, mundo!</h1>;

// Y esto es JavaScript puro equivalente
const saludo = React.createElement('h1', null, '¡Hola, mundo!');

La magia de JSX es que se compila a JavaScript normal. Cuando escribes <h1>¡Hola!</h1>, el compilador lo convierte automáticamente en una llamada a React.createElement().

Por qué JSX existe (y por qué es genial)

El problema que resuelve

Antes de JSX, crear interfaces dinámicas en React era verbose y difícil de leer:

// Sin JSX - difícil de leer
return React.createElement(
  'div',
  { className: 'container' },
  React.createElement('h1', null, 'Mi App'),
  React.createElement(
    'p',
    null,
    'Bienvenido, ',
    React.createElement('strong', null, usuario.nombre)
  )
);
// Con JSX - claro y legible
return (
  <div className="container">
    <h1>Mi App</h1>
    <p>Bienvenido, <strong>{usuario.nombre}</strong></p>
  </div>
);

La filosofía detrás

JSX refleja una verdad fundamental: en las aplicaciones modernas, la lógica y la interfaz están intrínsecamente conectadas. En lugar de separar artificialmente HTML, CSS y JavaScript en archivos diferentes, JSX te permite crear componentes cohesivos donde todo lo relacionado vive junto.

Diferencias clave entre JSX y HTML

Aunque JSX parece HTML, hay diferencias importantes:

1. Atributos con nombres diferentes

// HTML
<div class="mi-clase" for="input-id">

// JSX
<div className="mi-clase" htmlFor="input-id">

2. Expresiones JavaScript entre llaves

const nombre = "Ana";
const edad = 25;

return (
  <div>
    <h1>Hola, {nombre}</h1>
    <p>Tienes {edad} años</p>
    <p>En 10 años tendrás {edad + 10} años</p>
  </div>
);

3. Elementos deben estar cerrados

// ❌ Esto no funciona en JSX
<img src="foto.jpg">
<br>

// ✅ Esto sí funciona
<img src="foto.jpg" />
<br />

Reglas fundamentales de JSX

Regla 1: Un elemento padre

JSX debe devolver un solo elemento raíz:

// ❌ Error: múltiples elementos raíz
return (
  <h1>Título</h1>
  <p>Párrafo</p>
);

// ✅ Correcto: envuelto en un div
return (
  <div>
    <h1>Título</h1>
    <p>Párrafo</p>
  </div>
);

// ✅ También correcto: usando Fragment
return (
  <>
    <h1>Título</h1>
    <p>Párrafo</p>
  </>
);

Regla 2: Usar camelCase para atributos

// ❌ Kebab-case no funciona
<div background-color="blue" font-size="16px">

// ✅ CamelCase sí funciona
<div backgroundColor="blue" fontSize="16px">

Regla 3: Cuidado con las palabras reservadas

// ❌ 'class' es palabra reservada en JavaScript
<div class="mi-clase">

// ✅ Usar 'className'
<div className="mi-clase">

Ejemplos prácticos con JSX

Renderizado condicional

function Saludo({ usuario, esAdmin }) {
  return (
    <div>
      <h1>Bienvenido, {usuario.nombre}</h1>
      {esAdmin && (
        <div className="panel-admin">
          <h2>Panel de Administración</h2>
          <button>Gestionar usuarios</button>
        </div>
      )}
      {usuario.mensajes.length > 0 ? (
        <p>Tienes {usuario.mensajes.length} mensajes nuevos</p>
      ) : (
        <p>No tienes mensajes nuevos</p>
      )}
    </div>
  );
}

Listas y maps

function ListaTareas({ tareas }) {
  return (
    <ul>
      {tareas.map(tarea => (
        <li key={tarea.id} className={tarea.completada ? 'completada' : ''}>
          {tarea.texto}
        </li>
      ))}
    </ul>
  );
}

Manejo de eventos

function Contador() {
  const [count, setCount] = useState(0);

  const manejarClick = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <p>Has hecho clic {count} veces</p>
      <button onClick={manejarClick}>
        Haz clic aquí
      </button>
    </div>
  );
}

Ventajas de usar JSX

1. Legibilidad mejorada

JSX hace que el código sea más fácil de leer y escribir. La estructura visual del componente es inmediatamente clara.

2. Verificación de errores

Los editores pueden detectar errores de sintaxis en JSX y ofrecer autocompletado, algo imposible con strings de HTML.

3. Integración natural con JavaScript

Puedes usar cualquier expresión JavaScript dentro de JSX, haciendo que la lógica y la presentación fluyan naturalmente.

4. Componentes reutilizables

function Boton({ texto, onClick, tipo = 'primario' }) {
  return (
    <button 
      className={`btn btn-${tipo}`}
      onClick={onClick}
    >
      {texto}
    </button>
  );
}

// Uso
<Boton texto="Guardar" onClick={guardarDatos} tipo="success" />

Errores comunes al aprender JSX

Error 1: Olvidar las llaves para JavaScript

// ❌ Esto renderiza literalmente "usuario.nombre"
<h1>Hola, usuario.nombre</h1>

// ✅ Esto renderiza el valor de la variable
<h1>Hola, {usuario.nombre}</h1>

Error 2: Usar HTML en lugar de JSX

// ❌ HTML válido pero JSX inválido
<label for="nombre" class="etiqueta">

// ✅ JSX correcto
<label htmlFor="nombre" className="etiqueta">

Error 3: No usar keys en listas

// ❌ Sin keys (causa warnings)
{items.map(item => <div>{item.nombre}</div>)}

// ✅ Con keys únicas
{items.map(item => <div key={item.id}>{item.nombre}</div>)}

Mejores prácticas para JSX

1. Mantén los componentes pequeños

// ✅ Componente enfocado en una sola responsabilidad
function TarjetaUsuario({ usuario }) {
  return (
    <div className="tarjeta">
      <img src={usuario.avatar} alt={usuario.nombre} />
      <h3>{usuario.nombre}</h3>
      <p>{usuario.email}</p>
    </div>
  );
}

2. Usa fragmentos para evitar divs innecesarios

// ❌ Div wrapper innecesario
return (
  <div>
    <h1>Título</h1>
    <p>Contenido</p>
  </div>
);

// ✅ Fragment limpio
return (
  <>
    <h1>Título</h1>
    <p>Contenido</p>
  </>
);

3. Extrae lógica compleja fuera del JSX

function ComponenteComplejo({ datos }) {
  const procesarDatos = () => {
    return datos.filter(item => item.activo)
                .sort((a, b) => a.nombre.localeCompare(b.nombre));
  };

  const datosOrdenados = procesarDatos();

  return (
    <ul>
      {datosOrdenados.map(item => (
        <li key={item.id}>{item.nombre}</li>
      ))}
    </ul>
  );
}

Conclusión: JSX como puente hacia el futuro

JSX representa un cambio fundamental en cómo pensamos sobre las interfaces de usuario. En lugar de separar artificialmente tecnologías que trabajan juntas, JSX abraza la realidad de que en aplicaciones modernas, la lógica y la presentación están intrínsecamente conectadas.

Al principio puede parecer extraño mezclar "HTML" con JavaScript, pero una vez que experimentas la potencia de escribir interfaces declarativas con toda la flexibilidad de JavaScript a tu disposición, es difícil imaginar trabajar de otra manera.

JSX no es solo una sintaxis; es una filosofía que pone la experiencia del desarrollador y la claridad del código en primer lugar. Y esa es una revolución que vale la pena abrazar.

Comentarios

Posts relacionados