📐 React: ¿Librería o Framework?

El ecosistema React y cómo encaja en tu stack actual

React es una librería de UI, no un framework completo. Su misión es una sola: renderizar componentes de forma eficiente. Todo lo demás —ruteo, estado global, peticiones HTTP— lo resuelve el ecosistema.

🔍 Diferencias clave

🟢 vs Vue Framework progresivo Vue es progresivo: puedes empezar con un CDN y escalar a un SPA con Vue Router y Pinia. En React, la escalabilidad depende de tus elecciones (Next.js, Remix, React Router, Zustand…). Donde Vue tiene v-model, React te pide manejar el estado manualmente con useState y eventos onChange.
🔴 vs Angular Framework completo Angular es un framework con todas las piezas: CLI, módulos, DI, RxJS. React te da un fichero .jsx y total libertad — pero también más decisiones que tomar.

⚡ Primer JSX en acción

Edita el mensaje y pulsa Ejecutar:

Saludo.jsx editor-01

JSX y Renderizado

JavaScript + XML, el lenguaje de templates de React

JSX es azúcar sintáctico para React.createElement. No es HTML, aunque se parezca. Cada etiqueta JSX se transpila a una llamada a React.createElement que produce un elemento virtual del DOM.

📌 Expresiones en JSX

Con { } puedes incrustar cualquier expresión de JavaScript: variables, ternarios, .map(), operador lógico &&, etc.

🟢 vs Vue Templates vs JSX Vue separa template, script y estilo en .vue. En React, todo es JavaScript: JSX es el template. Donde Vue tiene v-if="mostrar", React usa {mostrar && <Componente />}. Donde Vue tiene v-for, React usa {arr.map()}.
🔴 vs Angular Directivas vs JS Angular usa atributos: [property]="val" y (event)="handler()". React normaliza todo con props: style={{color: 'red'}}, onClick={handler}. No hay *ngFor; usas array.map().
Expresiones.jsx editor-02

🧩 Componentes y Props

La unidad fundamental de UI en React

En React moderno (v16.8+) los componentes son funciones que devuelven JSX. Reciben un único argumento: un objeto props con los atributos que el componente padre les pasa.

📦 Props

Las props son de solo lectura. Se declaran desestructurando el primer argumento:

function Tarjeta({ titulo, descripcion }) {
  return <div>{titulo}: {descripcion}</div>;
}
🟢 vs Vue defineProps En Vue defines props con defineProps(['nombre', 'edad']). En React, son el argumento de la función, sin declaración explícita.
🔴 vs Angular @Input Angular usa el decorador @Input() para propiedades de entrada. React recibe un objeto plano — no hay decoradores ni metadatos.
TarjetaPerfil.jsx editor-03

⏺ Las props se pasan desde el sistema de ejecución.

🔢 Estado con useState y Eventos

Dale vida a tus componentes con estado local

useState es el Hook fundamental para añadir estado a un componente funcional. Devuelve un array con dos valores: el estado actual y una función para actualizarlo.

const [cuenta, setCuenta] = React.useState(0);

Los eventos en React se pasan como props onEvento (camelCase): onClick, onChange, onSubmit.

🟢 vs Vue ref() vs useState Vue 3 usa ref(0) o reactive(). La diferencia clave: en React, llamar a setEstado() es explícito; en Vue, la reasignación de ref.value es automáticamente reactiva.
🔴 vs Angular Signals Angular 17+ introdujo signal(), muy similar a useState: un contenedor de valor que notifica cambios.
Contador.jsx editor-04

⏱️ Efectos con useEffect

Sincroniza tu componente con el mundo exterior

useEffect ejecuta código después de renderizar. Ideal para: llamadas a API, suscripciones, timers, manipulación del DOM.

React.useEffect(() => {
  // efecto
  return () => { /* limpieza */ };
}, [dependencias]);
🟢 vs Vue watchEffect / onMounted Vue tiene onMounted, onUnmounted y watchEffect. La función de limpieza de useEffect equivale a onUnmounted.
🔴 vs Angular ngOnInit / ngOnDestroy Angular usa ngOnInit, ngOnDestroy y ngOnChanges. effect() de Signals (v17+) es el equivalente más directo a useEffect.
Temporizador.jsx editor-05

🌳 Context API

Comparte datos sin prop drilling

Context API permite compartir valores entre componentes sin pasarlos explícitamente por cada nivel del árbol. Ideal para temas, usuario autenticado, preferencias de idioma.

const MiCtx = React.createContext(valorDefecto);

// Proveedor
<MiCtx.Provider value={…}>
  <Hijo />
</MiCtx.Provider>

// Consumidor
const valor = React.useContext(MiCtx);
🟢 vs Vue provide/inject Vue tiene provide/inject, conceptualmente idéntico a Context: un ancestro provee un valor y cualquier descendiente lo inyecta.
🔴 vs Angular Inyección de dependencias Angular usa servicios @Injectable en el árbol de inyectores. Es más verboso, pero ofrece ámbitos que Context no gestiona nativamente.
TemaApp.jsx editor-06

📊 Comparativa y Conclusión

React vs Vue vs Angular — elige con criterio

ConceptoReactVueAngular
TipoLibrería UIFramework progresivoFramework completo
TemplateJSX (JS + XML)HTML + directivasHTML + directivas
ReactividaduseState explícitoProxies (ref/reactive)Zone.js / Signals
Estado globalContext API + libreríasPinia (oficial)Servicios @Injectable
Bindingvalue + onChangev-model[(ngModel)]
CondicionalesTernario {x ? a : b}v-if / v-show*ngIf
Bucles{arr.map(x => …)}v-for*ngFor
RouterReact Router (tercero)Vue Router (oficial)@angular/router
EfectosuseEffectonMounted / watchEffectngOnInit / ngOnDestroy
Curva aprendizajeMediaBajaAlta
EcosistemaEnorme, decisiones propiasExtenso, guiadoOficial, todo incluido

🎯 ¿Cuándo elegir qué?

✅ Conclusión

React te da superpoderes con JavaScript. No hay magia: useState, useEffect, props y Context son todo lo que necesitas.

🧪 Cuestionario

Comprueba lo aprendido en 5 preguntas

1. React es…

2. ¿Cómo se incrusta una expresión de JS en JSX?

3. ¿Qué Hook usas para estado local?

4. ¿Qué array de dependencias en useEffect ejecuta el efecto solo al montar?

5. ¿Cómo compartes estado global en React sin librerías externas?

📊 Resultado