14-Archivos JSX en React

  Introducción a JSX

En React, JSX es una extensión de sintaxis que nos permite escribir código similar a HTML dentro de archivos JavaScript. Esto es una gran ventaja sobre el JavaScript tradicional donde teníamos que escribir HTML como strings.

¿Qué veremos en este tutorial?

  1. Diferencias entre JavaScript tradicional y JSX

  2. Cómo crear y trabajar con archivos .jsx

  3. Estructura básica de un proyecto React

  4. Renderizado de componentes


1. De JavaScript Tradicional a JSX

JavaScript tradicional (sin React)

javascript
// Teníamos que escribir HTML como strings
const elemento = '<div class="contenedor"><h1>Hola Mundo</h1></div>';
document.getElementById('root').innerHTML = elemento;

Con JSX en React

jsx
// ¡Podemos escribir HTML directamente!
const elemento = (
  <div className="contenedor">
    <h1>Hola Mundo</h1>
  </div>
);

ReactDOM.createRoot(document.getElementById('root')).render(elemento);

Ventajas de JSX:

  • Auto-completado de código

  • Mejor detección de errores

  • Más legible

  • Integración con herramientas de desarrollo


2. Configuración Inicial del Proyecto React

Estructura de archivos inicial:

text
mi-proyecto-react/
├── public/
│   └── index.html
├── src/
│   ├── index.jsx
│   ├── App.jsx
│   └── index.css
└── package.json

Archivo public/index.html

html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Mi App React</title>
</head>
<body>
    <!-- Punto de entrada de nuestra aplicación -->
    <div id="root"></div>
</body>
</html>

3. El Archivo Principal: index.jsx

jsx
// Importamos las dependencias necesarias
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';  // Importamos estilos
import App from './App';  // Importamos nuestro componente principal

// 1. Capturamos el elemento raíz del HTML
const rootElement = document.getElementById('root');

// 2. Creamos la raíz de React
const root = ReactDOM.createRoot(rootElement);

// 3. Renderizamos nuestra aplicación
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

Explicación paso a paso:

Paso 1: Importamos React y ReactDOM

  • React: La biblioteca principal

  • ReactDOM: Para interactuar con el DOM

  • createRoot: Nueva API en React 18+ para crear la raíz

Paso 2: Encontramos el contenedor en el HTML

  • Usamos document.getElementById('root') para encontrar nuestro div con id "root"

Paso 3: Creamos y renderizamos

  • ReactDOM.createRoot() crea el punto de entrada

  • .render() muestra nuestro contenido

Importante: <React.StrictMode> es un wrapper que ayuda a detectar problemas potenciales durante el desarrollo.


4. Cambiando la Extensión a .jsx

¿Por qué usar .jsx en lugar de .js?

  1. Claridad: Indica que el archivo contiene JSX

  2. Herramientas: Mejor soporte en editores de código

  3. Convención: Estándar en la comunidad React

Cómo renombrar:

text
Antes: index.js
Después: index.jsx

Nota: Después de cambiar la extensión, debemos reiniciar el servidor de desarrollo:

bash
# Presiona Ctrl+C en la terminal
npm start
# O
yarn start

5. Creando Nuestro Primer Componente: App.jsx

jsx
// App.jsx
import React from 'react';
import './App.css';  // Podemos importar estilos específicos

// Definimos nuestro componente principal
function App() {
  return (
    <div className="app-container">
      <h1>¡Bienvenido a React!</h1>
      <p>Este es mi primer componente JSX</p>
      <button onClick={() => alert('¡Hola!')}>
        Haz clic aquí
      </button>
    </div>
  );
}

// Exportamos el componente
export default App;

6. Diferencias Clave entre HTML y JSX

HTML tradicionalJSX en React
classclassName
forhtmlFor
onclickonClick
style="color: red;"style={{color: 'red'}}
Comentarios <!-- -->{/* Comentario */}

Ejemplo de estas diferencias:

jsx
function EjemploDiferencias() {
  return (
    <div className="contenedor" style={{ backgroundColor: '#f0f0f0' }}>
      <label htmlFor="nombre">Nombre:</label>
      <input id="nombre" type="text" />
      
      {/* Este es un comentario en JSX */}
      <button onClick={() => console.log('Click!')}>
        Presionar
      </button>
    </div>
  );
}

7. Ejercicio Práctico: Crear un Componente JSX

Paso 1: Crea un nuevo archivo Saludo.jsx

jsx
// Saludo.jsx
import React from 'react';

function Saludo({ nombre }) {
  return (
    <div className="saludo-card">
      <h2>¡Hola, {nombre}!</h2>
      <p>Bienvenido al mundo de JSX y React</p>
      <small>Fecha: {new Date().toLocaleDateString()}</small>
    </div>
  );
}

export default Saludo;

Paso 2: Úsalo en App.jsx

jsx
// App.jsx actualizado
import React from 'react';
import Saludo from './Saludo';
import './App.css';

function App() {
  const usuarios = ['Ana', 'Carlos', 'María', 'Juan'];

  return (
    <div className="app-container">
      <h1>Lista de Saludos</h1>
      
      {usuarios.map((usuario, index) => (
        <Saludo key={index} nombre={usuario} />
      ))}
      
      <div className="contenedor-extra">
        <p>Este es un ejemplo de cómo JSX nos permite mezclar JavaScript y HTML</p>
      </div>
    </div>
  );
}

export default App;

8. Consejos y Buenas Prácticas

Estructura de Carpetas Recomendada:

text
src/
├── components/     # Componentes reutilizables
│   ├── Button.jsx
│   ├── Card.jsx
│   └── Header.jsx
├── pages/          # Páginas completas
│   ├── Home.jsx
│   └── About.jsx
├── App.jsx         # Componente principal
└── index.jsx       # Punto de entrada

Reglas de JSX:

  1. Solo un elemento padre: Cada componente debe retornar un solo elemento

  2. Cerrar todas las etiquetas: Las etiquetas deben cerrarse explícitamente

  3. className en lugar de class: Para atributos CSS

  4. Expresiones JavaScript: Usar {} para incluir JavaScript

Ejemplo de múltiples elementos:

jsx
// ❌ INCORRECTO
function ComponenteIncorrecto() {
  return (
    <h1>Título</h1>
    <p>Párrafo</p>
  );
}

// ✅ CORRECTO
function ComponenteCorrecto() {
  return (
    <div>
      <h1>Título</h1>
      <p>Párrafo</p>
    </div>
  );
}

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

9. Solución de Problemas Comunes

Problema 1: Error después de cambiar a .jsx

Solución: Reinicia el servidor de desarrollo

bash
Ctrl + C
npm start

Problema 2: El componente no se muestra

Verifica:

  1. ¿Exportaste el componente? export default Componente

  2. ¿Importaste correctamente? import Componente from './Componente'

  3. ¿Estás usando el componente? <Componente />

Problema 3: Errores de sintaxis JSX

Recuerda:

  • Las etiquetas deben cerrarse: <img /><input />

  • Usar className no class

  • Las expresiones JavaScript van entre {}


10. Resumen Final

JSX transforma la forma en que escribimos interfaces en JavaScript:

  1. Mezcla HTML y JavaScript de forma natural

  2. Componentes reutilizables como bloques de construcción

  3. Sintaxis más clara y fácil de mantener

  4. Mejor experiencia de desarrollo con herramientas modernas

Próximos pasos recomendados:

  1. Aprender sobre props y state

  2. Explorar hooks como useState y useEffect

  3. Crear componentes más complejos

  4. Aprender sobre enrutamiento con React Router


Recursos Adicionales

¡Felicidades! Ahora comprendes los fundamentos de JSX en React. Sigue practicando creando más componentes y explorando las posibilidades que ofrece esta poderosa herramienta.

Comentarios

Entradas más populares de este blog

11. Creando un proyecto react con create-react-app

29. useEffect

38. 4 Routers