Modelo mental completo de React | Nicolás Garzón
Inicio Wiki React Modelo mental completo de React Volver a ReactReact
Modelo mental completo de React Integra datos, estado, render, identidad, efectos, composición, Suspense, accesibilidad, rendimiento, arquitectura y producción en un modelo completo de React.
Última actualización Actualizada 25 de jul de 2026 Nota anteriorAPIs avanzadas, legado y compatibilidad Aprender React no consiste en memorizar hooks. Consiste en comprender qué datos entran, qué estado debe conservarse, qué ocurre durante render, cómo React mantiene identidad y qué trabajo pertenece a eventos, effects o al servidor.
Texto
Copiar datos y eventos
↓
props + state + context
↓
render puro
↓
árbol de elementos
↓
reconciliation e identidad
↓
commit y DOM
↓
effects y sistemas externos
↓
composición y reutilización
↓
Suspense y transitions
↓
testing, accesibilidad y rendimiento
↓
arquitectura y producción
¿Qué llega como props?
¿Qué proviene de Context?
¿Qué pertenece a una store externa?
¿Qué es server state?
¿Qué puede calcularse?
Las props son de solo lectura desde la perspectiva del componente. Context distribuye dependencias. Una store externa mantiene state fuera de React.
State recuerda información entre renders:
TypeScript
Copiar const [ quantity, setQuantity] = useState ( 1 ) ;
Datos calculables.
Copias de props sin necesidad.
La misma entidad en varios estados.
Variables que no afectan UI.
¿Qué información necesita recordar React para producir el siguiente render?
Durante render React ejecuta componentes:
Texto
Copiar props + state + context
↓
component function
↓
React elementsRender debe ser puro e idempotente. Puede repetirse, interrumpirse o descartarse.
Requests.
Escrituras en storage.
Mutaciones externas.
DOM imperativo.
Suscripciones.
Cada render observa una fotografía:
TypeScript
Copiar setCount ( count + 1 ) ;
console . log ( count) ; El setter solicita otro render; no modifica la variable actual.
Para calcular desde el valor pendiente anterior:
TypeScript
Copiar setCount ( ( current) => current + 1 ) ; React agrupa actualizaciones dentro de una interacción cuando puede. Los updater functions se procesan en orden.
No describas state simplemente como “asíncrono”; piensa en snapshots y colas.
React conserva state cuando coincide:
Texto
Copiar misma posición + mismo tipo + misma key
↓
state preservadoCambiar tipo, posición o key puede reiniciar la instancia.
Keys no solo eliminan warnings; comunican identidad entre hermanos.
React calcula el siguiente árbol y lo compara con el anterior. Usa tipo y key para decidir qué preservar.
No significa una comparación profunda universal ni garantiza que toda UI sea rápida.
Cuando el resultado cambia, React aplica operaciones al host environment:
Texto
Copiar render → reconciliation → commit → browser paintUn render no implica cambio del DOM. Un commit tampoco implica que el navegador ya haya pintado.
Un handler responde a una interacción concreta:
TypeScript
Copiar async function handleSubmit ( ) {
await saveOrder ( ) ;
}
Click.
Submit.
Input.
Teclado.
Drag.
No conviertas la intención del usuario en state para observarla mediante effect.
Un effect sincroniza con algo externo:
Texto
Copiar render → commit → setup
change → cleanup → setup
unmount → cleanupÚsalo para conexiones, observers, timers, widgets y listeners.
Elimina effects usados para cálculos derivados o cadenas de state.
Una ref conserva un valor que no participa directamente en render:
TypeScript
Copiar const inputRef = useRef < HTMLInputElement> ( null ) ;
Focus.
Scroll.
IDs de timers.
Integración imperativa.
No la uses como state oculto para evitar renders necesarios.
Context transporta un valor a descendants. No administra state automáticamente ni reemplaza caches.
Antes de usarlo evalúa props, composición y colocación del state.
Un reducer concentra transiciones:
Texto
Copiar state + action → next stateAporta cuando múltiples eventos modifican state relacionado. No lo uses para envolver setters sin dominio.
Un custom hook reutiliza lógica, no state compartido automáticamente.
Cada llamada tiene su propia instancia de hooks.
Diseña su API alrededor de un caso de uso, no de una abstracción genérica sin propósito.
React favorece composición:
Children.
Slots.
Component props.
Compound components.
Headless behavior.
Crea componentes según responsabilidad, no por cantidad de líneas.
Controlled.
Uncontrolled.
Native validation.
Product validation.
Actions.
Modela loading, errors, success y reset. El servidor siempre valida de nuevo.
Texto
Copiar client state
→ selección, modal, input
server state
→ datos remotos, cache, stale, refetchReact no prescribe una única estrategia. Evalúa framework loaders, Server Components o librerías de cache.
Suspense coordina una boundary cuando una fuente compatible está pendiente. No convierte cualquier fetch en suspendible.
Combínalo con Error Boundaries y transitions.
Marcan actualizaciones no urgentes. Mantienen inputs responsivos y pueden conservar UI visible.
No hacen el trabajo más rápido ni ejecutan React en varios hilos.
SSR produce HTML inicial. Hydration conecta ese HTML con React cliente.
El primer render debe coincidir para evitar mismatches.
RSC ejecuta componentes en servidor sin enviar su implementación al cliente. Requiere framework.
Texto
Copiar SSR → HTML inicial
RSC → representación de componentes servidor
Client Component → región con capacidades clienteReact no corrige HTML incorrecto. Evalúa:
Semántica.
Nombre accesible.
Teclado.
Focus.
Estados dinámicos.
Errores de formulario.
Portals.
Suspense.
La accesibilidad es parte de la API del componente.
Texto
Copiar interacción lenta
↓
medir red + React + navegador
↓
encontrar trabajo dominante
↓
corregir y volver a medirMemoización no es una regla de corrección. Re-render no equivale a problema.
Prueba comportamiento observable:
Qué ve el usuario.
Qué puede activar.
Qué se anuncia.
Qué ocurre en loading, error y success.
Prefiere queries por role y accessible name.
React escapa texto, pero todavía existen:
URLs peligrosas.
dangerouslySetInnerHTML.
Secretos en bundle.
Auth sin autorización.
Datos no validados.
Dependencias vulnerables.
La seguridad se valida en cada límite.
Decide ownership y dependencias:
Texto
Copiar feature
├─ UI
├─ hooks
├─ domain
├─ data access
└─ public APINo existe una estructura universal. Coloca código cerca de donde cambia y crea fronteras después de observar responsabilidades reales.
¿Qué responsabilidad representa?
¿Qué props forman su API?
¿Qué state mínimo necesita?
¿Qué puede calcular durante render?
¿Qué interacción pertenece a handlers?
¿Qué sistema externo requiere effect?
¿Qué identidad debe conservarse?
¿Qué semántica HTML produce?
¿Cómo funciona con teclado?
¿Qué estados loading, empty, error y success existen?
¿Cómo se prueba por comportamiento?
¿Existe un problema medido de rendimiento?
Props claras y tipadas.
State mínimo.
Render puro.
Keys estables.
No muta props o state.
Handlers para interacciones.
Effects reversibles y necesarios.
Cleanup completo.
HTML semántico.
Focus y teclado correctos.
Estados extremos modelados.
Tests observables.
Sin memoización supersticiosa.
Ownership de state definido.
Server state no duplicado.
Contexts acotados.
Boundaries de error y Suspense.
Rutas con loading y error coherentes.
Data fetching sin waterfalls evitables.
Accesibilidad por pantalla.
Monitoring y releases.
Bundle analizado.
Seguridad cliente-servidor.
Compatibilidad y rollback.
Texto
Copiar síntoma
↓
¿error de JavaScript, navegador, React o framework?
↓
reproducción mínima
↓
props/state/context del render afectado
↓
identity y keys
↓
handlers y effects
↓
DOM, network y serverNo empieces añadiendo memoización o effects. Aísla primero la causa.
Modelo declarativo.
JSX.
Components y props.
Events.
Lists y keys.
Render, commit e identity.
State y forms.
Accessibility.
Reducers.
Context.
Effects y refs.
Custom hooks.
Composition.
Data fetching.
Testing.
Architecture.
Suspense.
Transitions.
External stores.
Performance.
SSR e hydration.
Server Components.
Compiler y APIs recientes.
Construye un carrito con state mínimo y total derivado.
Diseña tabs controlados y no controlados.
Integra un listener externo con cleanup.
Corrige una lista que usa index como key y se reordena.
Construye un modal accesible con focus restoration.
Mide una lista lenta antes y después de virtualizar.
Separa server state de client state en una pantalla.
Explica qué se preserva al cambiar una key.
Diseña una Error Boundary por widget.
Compara SSR y Server Components en un diagrama.
Texto
Copiar input urgente
↓ query state
useDeferredValue
↓
resultados no urgentes
↓
Suspense boundary
↓
data cache
¿Debounce de red o deferred render?
¿Quién posee cache?
¿Cómo se muestra stale content?
¿Qué anuncia un lector de pantalla?
¿Cómo se cancela una búsqueda obsoleta?
Texto
Copiar native form semantics
↓
validation
↓
Action / submit handler
↓
pending + optimistic state
↓
confirmed result or rollbackConsidera idempotencia, errores, focus y autorización servidor.
Texto
Copiar JavaScript
→ closures, referencias, asincronía y módulos
TypeScript
→ contratos de props, reducers, refs y boundaries
HTML
→ semántica, formularios, landmarks y accesibilidad
CSS
→ layout, presentación, responsive y estados visuales
React
→ componentes, state, identity y sincronización
Next.js
→ routing, rendering por ruta, RSC, cache y deploymentReact no reemplaza los anteriores; los coordina para construir interfaces.
“Todo valor cambiante es state”.
“Cada render modifica DOM”.
“useEffect es lifecycle genérico”.
“Context es state global”.
“useMemo siempre mejora”.
“Suspense sirve para cualquier Promise”.
“Concurrent significa paralelo”.
“Client Component solo renderiza en cliente”.
“React hace accesible cualquier JSX”.
“Más componentes siempre es mejor”.
Texto
Copiar qué datos recibe
→ qué state necesita
→ qué ocurre durante render
→ cómo conserva identity
→ qué provoca update
→ qué pertenece al event
→ qué sincroniza un effect
→ cómo compone la UI
→ cómo se prueba, optimiza y entregaEse flujo importa más que memorizar una lista de APIs.
¿Qué diferencia existe entre render y commit?
¿Cuándo un valor debe ser state?
¿Qué determina si React preserva una instancia?
¿Qué frase debe completar un buen effect?
¿Por qué Server Components no reemplazan SSR?
Ver respuestas
Render calcula elementos; commit aplica cambios al host.
Cuando debe recordarse entre renders y afecta la UI.
Tipo, posición y key dentro del árbol.
“Este componente debe sincronizarse con…”.
RSC produce representación servidor; SSR produce HTML inicial y pueden combinarse.
Construye una aplicación pequeña sin framework que incluya formulario, lista con keys, Context acotado, effect externo y tests. Después estudia Next.js para ver cómo un framework añade routing, rendering por ruta, Server Components, cache y deployment sobre este modelo.