React

Construye UIs interactivas con componentes - biblioteca JavaScript declarativa, eficiente y flexible

TL;DR

En una línea: React es una biblioteca JavaScript para construir UIs con componentes - los bloques Lego del desarrollo web.

Fortalezas principales:

  • Basado en componentes - construye una vez, reutiliza en todas partes
  • Virtual DOM - actualizaciones rápidas sin tocar el DOM real
  • Hooks - gestión elegante de estado y ciclo de vida
  • Ecosistema masivo - React Native, Next.js y miles de bibliotecas

Core Concepts

Concept 1: Components

Todo en React es un componente. Un componente es simplemente una función que devuelve JSX (sintaxis similar a HTML en JavaScript).

function Welcome({ name }) {
  return <h1>¡Hola, {name}!</h1>;
}

// Úsalo como HTML
<Welcome name="Alice" />

Concept 2: State & Props

Props = datos pasados del padre al hijo (solo lectura) State = datos gestionados dentro de un componente (puede cambiar)

function Counter() {
  const [count, setCount] = useState(0);  // State
  return <button onClick={() => setCount(count + 1)}>{count}</button>;
}

Concept 3: One-way Data Flow

Los datos fluyen hacia abajo del padre al hijo a través de props. El hijo no puede modificar los datos del padre directamente - en su lugar llama funciones callback.

Quick Start

Create Project

# Usando Vite (recomendado)
npm create vite@latest my-app -- --template react
cd my-app
npm install
npm run dev

Project Structure

my-app/
├── src/
│   ├── App.jsx       # Componente raíz
│   ├── main.jsx      # Punto de entrada
│   └── index.css
├── index.html
├── package.json
└── vite.config.js

Minimal Example

// src/App.jsx
import { useState } from 'react';

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

  return (
    <div>
      <h1>¡Hola React!</h1>
      <button onClick={() => setCount(count + 1)}>
        Contador: {count}
      </button>
    </div>
  );
}

export default App;

Run

npm run dev
# Abre http://localhost:5173

Gotchas

Component names must be capitalized

// ❌ Incorrecto - se trata como etiqueta HTML
function myButton() { return <button>Hi</button> }

// ✅ Correcto
function MyButton() { return <button>Hi</button> }

Don’t call handlers, pass them

// ❌ Incorrecto - se ejecuta inmediatamente al renderizar
<button onClick={handleClick()}>

// ✅ Correcto - pasa la referencia
<button onClick={handleClick}>

// ✅ Con argumentos
<button onClick={() => handleClick(id)}>

State updates are async

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

function handleClick() {
  setCount(count + 1);
  console.log(count);  // ¡Aún 0! El estado se actualiza en el próximo render
}

// Usa la forma de función para múltiples actualizaciones
setCount(c => c + 1);
setCount(c => c + 1);  // Ahora suma correctamente 2

State is immutable

// ❌ Incorrecto - mutando el estado
user.name = 'Nuevo Nombre';
setUser(user);  // ¡React no re-renderizará!

// ✅ Correcto - nuevo objeto
setUser({ ...user, name: 'Nuevo Nombre' });

// Para arrays
setItems([...items, newItem]);  // Añadir
setItems(items.filter(i => i.id !== id));  // Eliminar

When to Use

Ideal para:

  • Aplicaciones de una sola página (SPAs)
  • UIs interactivas complejas
  • Equipos que quieren reutilizar componentes
  • Proyectos que necesitan fuerte soporte del ecosistema

No ideal para:

  • Sitios estáticos simples (usa Astro, Hugo)
  • Sitios críticos para SEO sin configuración SSR (usa Next.js en su lugar)
  • Proyectos muy pequeños (JS vanilla podría ser suficiente)

Comparación:

CaracterísticaReactVueAngular
Curva de aprendizajeMediaFácilEmpinada
Tamaño40KB30KB150KB+
EstiloBibliotecaFrameworkFramework completo
FlexibilidadAltaMediaOpinionado

Next Steps

Cheatsheet

PatrónCódigo
Componentfunction Name() { return <div>...</div> }
Propsfunction Card({ title }) { ... }
Stateconst [val, setVal] = useState(initial)
EffectuseEffect(() => { ... }, [deps])
Refconst ref = useRef(null)
Contextconst val = useContext(MyContext)
Condicional{show && <Component />}
Lista{items.map(i => <Item key={i.id} />)}
EventonClick={fn} / onChange={fn}