Saltar al contenido

Glosario

54 términos que no se traducen

Acá los términos técnicos van en inglés: se escribe Fiber, no fibra; commit, no confirmación. Traducirlos rompe la búsqueda, corta la continuidad con la documentación oficial y te obliga a aprender cada cosa dos veces. Lo que va en español es la explicación.

En las lecciones, cualquier término subrayado con puntos muestra su definición al pasarle el mouse o al enfocarlo con el teclado.

54 términos

ActionServidortambién: Actions, Server Action
Pasándole una función a la prop action de un form, React se encarga del estado pendiente, del resultado y del error. useActionState devuelve el estado y la acción envuelta; useFormStatus lee el estado del form más cercano hacia arriba, desde un hijo.

se explica a fondo acá →ver también:Server Component

alternateEl motor
Cada Fiber apunta con alternate a su gemelo del árbol opuesto. React mantiene dos árboles — current (lo que se ve) y workInProgress (lo que se construye) — y los recicla alternándolos en vez de asignar objetos nuevos en cada render.

se explica a fondo acá →ver también:double bufferingworkInProgress

bailoutEl motor
Para hacer bailout tienen que darse tres condiciones: existe un Fiber current, las props son las mismas por identidad (o superficialmente iguales si hay memo) y el Fiber no tiene lanes pendientes. Si se cumplen, React clona los hijos y ni ejecuta la función. El bailout se propaga hacia abajo.

se explica a fondo acá →ver también:memolane

baseStateEl motor
Cuando React saltea un update de baja prioridad, congela baseState en el valor previo a ese update y guarda el resto de la cola. En la pasada siguiente reaplica todo desde ahí, incluso los updates de alta prioridad que ya se habían aplicado. Así el resultado final depende del orden en que llamaste a los setters, no de cómo React repartió el trabajo.

se explica a fondo acá →ver también:laneupdate queue

batchingHookstambién: batching automático
React abre un lote y todo lo que se encole adentro se procesa junto. Hasta React 17 el lote existía sólo dentro de manejadores de eventos: un setState en un setTimeout o una promesa disparaba su propio render. Desde React 18, createRoot agrupa en cualquier contexto.

se explica a fondo acá →ver también:update queuelane

beginWorkEl motor
beginWork se llama al bajar por cada Fiber. Chequea si puede hacer bailout; si no, ejecuta la función del componente y reconcilia sus hijos. Devuelve el próximo Fiber a procesar o null si llegó a una hoja.

se explica a fondo acá →ver también:completeWorkbailout

cleanupHooks
React guarda la función que devolvés como destroy y la llama antes de ejecutar el efecto siguiente y al desmontar el componente. El orden es siempre cleanup y después create: eso es lo que hace que un efecto sea idempotente y sobreviva al doble montaje de StrictMode.

se explica a fondo acá →ver también:useEffectStrictMode

commitEl motortambién: commit phase, fase commit
El commit tiene tres etapas: mutación (aplica lo que la fase render marcó con flags), intercambio de árboles (root.current = finishedWork) y layout effects. Corre entera de un saque, porque una interfaz a medio actualizar sería peor que una vieja. El navegador pinta después.

se explica a fondo acá →ver también:render phaseflags

completeWorkEl motor
Cuando una rama termina, React sube llamando a completeWork en cada Fiber. Ahí se crean o actualizan las instancias host y se enganchan los hijos ya listos al padre. Por eso el árbol del DOM se arma de las hojas hacia la raíz.

se explica a fondo acá →ver también:beginWorkhost component

dependency arrayHookstambién: array de dependencias, deps
React compara el array nuevo contra el guardado, elemento por elemento, con Object.is. Es una comparación superficial y por identidad: un objeto o una función creados en el cuerpo del componente son siempre distintos entre renders, así que ponerlos ahí equivale a no poner deps.

se explica a fondo acá →ver también:useEffectuseMemo

double bufferingEl motor
React nunca tiene un solo árbol: tiene current y workInProgress. Construye en privado, y al terminar el commit hace root.current = finishedWork. Es la misma técnica de los motores gráficos: nadie ve un cuadro a medio dibujar.

se explica a fondo acá →ver también:alternatecommit

eager stateHooks
Si la cola está vacía y el Fiber no tiene trabajo pendiente, React aplica el reducer al vuelo. Si el resultado es idéntico por Object.is, tira el update y ni siquiera agenda un render. Por eso setCount(count) no hace nada — y por eso mutar un objeto sin cambiar su referencia tampoco.

se explica a fondo acá →ver también:update queuebailout

elementRender y árboltambién: React element, elemento
JSX compila a llamadas que producen un objeto con $$typeof, type, key y props. Es descartable y se recrea en cada render. No sabe nada del DOM y no tiene métodos: es una descripción de cómo debería verse algo.

se explica a fondo acá →ver también:FiberJSX

Error BoundaryRender y árboltambién: Error Boundaries
Se declaran con clases porque son los únicos componentes con getDerivedStateFromError — que corre en la fase render y sólo devuelve estado — y componentDidCatch, que corre en el commit y es donde van los efectos como reportar el error. Si no hay ninguno, React desmonta la aplicación entera a propósito.

se explica a fondo acá →ver también:unwindingSuspense

FiberEl motortambién: fibers
Un Fiber es un objeto plano que representa una instancia de un componente en el árbol. Guarda su tipo, sus props, la cadena de hooks en memoizedState, punteros a su hijo, hermano y padre, los flags de qué hacer en el commit y las lanes de trabajo pendiente. Tu estado no vive en tu función: vive acá. Se llama Fiber porque es la unidad de trabajo que el reconciler puede empezar, pausar y retomar.

se explica a fondo acá →ver también:alternatememoizedStatereconciler

flagsEl motortambién: effect tags
Cada Fiber lleva un bitmask de flags: Placement (insertar), Update (cambiar props), Deletion (desmontar), Passive (tiene useEffect), Layout (tiene useLayoutEffect). El commit aplica sólo lo marcado; todo lo demás ni se toca.

se explica a fondo acá →ver también:commit

hookHookstambién: hooks
Cada hook es un objeto con memoizedState, baseState, una queue de updates y un puntero next. Se crean en orden de llamada durante el montaje y se clonan en paralelo en cada actualización. De esa estructura salen las dos reglas de los hooks.

se explica a fondo acá →ver también:memoizedStateupdate queue

host componentRender y árbol
React distingue los componentes de función de los host components, que son los que tienen una contraparte real en el destino. Sólo estos tienen stateNode apuntando al nodo del DOM. Por eso, para encontrar el nodo de un componente, hay que bajar hasta el primer host.

ver también:FibercompleteWork

hydrationServidor
React construye el árbol de Fibers sobre nodos que ya están en el documento y les engancha los listeners. Espera que el HTML del servidor coincida exactamente con lo que renderiza el cliente; si no coincide, descarta y vuelve a renderizar del lado del cliente, que es lento y visible.

se explica a fondo acá →ver también:Server ComponentuseId

JSXRender y árbol
JSX no es parte de JavaScript: Babel o SWC lo traducen a jsx(type, props) antes de que el navegador vea nada. En desarrollo el compilador usa jsx-dev-runtime y en producción jsx-runtime — por eso una librería que provee su propio runtime tiene que exportar los dos.

se explica a fondo acá →ver también:element

keyRender y árboltambién: keys
React recorre los hijos en paralelo mientras las keys coincidan; cuando dejan de coincidir arma un mapa por key con los que quedan. Encontrar el Fiber es conservar su estado. Usar el índice del array le dice a React que la identidad es la posición, y al reordenar el estado se queda pegado al lugar en vez de al dato.

se explica a fondo acá →ver también:reconciliationFiber

laneEl motortambién: lanes
Las lanes son un bitmask de 31 bits donde cada bit es una prioridad. Al llamar setState, React marca la lane subiendo hasta la raíz. Después elige el conjunto de mayor prioridad y renderiza sólo eso, dejando el resto para otra pasada con su propio commit y su propio pintado.

se explica a fondo acá →ver también:baseStatetransition

memoRendimientotambién: React.memo
Sin memo, el bailout necesita que las props sean el MISMO objeto — cosa que casi nunca pasa, porque el padre las recrea en cada render. memo compara clave por clave con Object.is. Pero alcanza con que una prop sea una función o un objeto inline para que no sirva: es un contrato de dos partes.

se explica a fondo acá →ver también:bailoutuseCallback

memoizedStateHooks
En un componente de función, fiber.memoizedState apunta al primer hook de una lista enlazada. Cada hook apunta al siguiente con .next. No hay ningún array indexado por nombre: la identidad de un hook es su posición en esa cadena.

se explica a fondo acá →ver también:Fiberhook

portalRender y árbol
createPortal renderiza en otro nodo del DOM, pero el componente sigue en el mismo lugar del árbol de React. Los eventos burbujean por la jerarquía de React y el contexto se lee igual. El árbol de React y el del documento dejan de coincidir, y eso es a propósito.

se explica a fondo acá →ver también:host component

ProfilerRendimiento
Envolvés un subárbol en React.Profiler y recibís un callback por cada commit con la fase (mount o update) y cuánto tardó. Sólo funciona en builds de desarrollo o de profiling: en producción es un no-op.

ver también:commit

React CompilerRendimiento
Analiza tus componentes y agrega el equivalente a useMemo y useCallback donde hace falta, con más precisión que a mano. Sólo puede hacerlo si el código es puro y respeta las reglas de los hooks: no es magia, es análisis estático que necesita garantías.

se explica a fondo acá →ver también:useMemomemo

reconcilerEl motor
El reconciler es el corazón de React: recorre el árbol construyendo un workInProgress, compara cada nivel contra el árbol current y marca con flags lo que hay que insertar, actualizar o borrar. Es independiente del destino: el mismo reconciler alimenta react-dom, react-native y cualquier renderer.

se explica a fondo acá →ver también:reconciliationworkInProgress

reconciliationEl motortambién: reconciliación
Comparar dos árboles cuesta O(n³) en el caso general. React lo baja a O(n) con dos suposiciones: dos elementos de tipo distinto producen árboles distintos, y el programador puede marcar qué hijos son «el mismo» con una key. Sólo compara el mismo nivel, nunca en profundidad.

se explica a fondo acá →ver también:keyreconciler

refRender y árbol
Las refs se pueblan entre la mutación y los layout effects del commit. Por eso son null durante el render y ya están listas en useLayoutEffect. Desde React 19 ref es una prop común y forwardRef quedó obsoleto.

se explica a fondo acá →ver también:useRefcommit

render phaseEl motortambién: fase render
En la fase render React baja con beginWork y sube con completeWork, ejecutando la función de cada componente que lo necesite. Nada de esto toca la pantalla y puede abandonarse a la mitad. Por eso tiene que ser pura: puede ejecutarse dos veces o descartarse.

se explica a fondo acá →ver también:commitbeginWorkcompleteWork

Server ComponentServidortambién: Server Components, RSC
Puede leer la base de datos o el sistema de archivos directamente. No tiene estado ni efectos porque no vuelve a ejecutarse. Su salida viaja serializada al cliente. La directiva use client no marca dónde se ejecuta algo: marca dónde EMPIEZA el cliente.

se explica a fondo acá →ver también:use clienthydration

snapshotConcurrencia
getSnapshot se llama durante la fase render, no en un efecto. Por eso todo lo que se renderiza en esa pasada ve el mismo valor. React también lo vuelve a leer antes de commitear para detectar si cambió a mitad de camino.

se explica a fondo acá →ver también:tearinguseSyncExternalStore

StrictModeRender y árbol
Llama a la función del componente dos veces y descarta un resultado, y desde React 18 monta, desmonta y vuelve a montar cada componente. No es un desperdicio: es un detector. Si tu componente se comporta distinto la segunda vez, tenés un efecto secundario donde no va o te falta un cleanup.

se explica a fondo acá →ver también:cleanuprender phase

SuspenseConcurrencia
Suspender es interrumpir el render lanzando una promesa. React hace unwinding hasta el Suspense más cercano, descarta el trabajo y muestra el fallback; cuando la promesa resuelve, reintenta. Es el mismo mecanismo que los Error Boundaries con otra carga.

se explica a fondo acá →ver también:useunwindingError Boundary

tearingConcurrencia
Con renderizado concurrente, React puede interrumpir un render a la mitad. Si un store externo cambia en ese hueco, los componentes ya renderizados muestran el valor viejo y los que faltan el nuevo. useSyncExternalStore existe exactamente para que eso no pase.

se explica a fondo acá →ver también:useSyncExternalStoresnapshot

transitionConcurrencia
Marcar algo como transition no lo hace más rápido: le dice a React que puede quedarse atrás si llega algo urgente. React procesa la prioridad alta primero, commitea, deja pintar, y recién después arranca otra pasada completa para la transición.

se explica a fondo acá →ver también:laneuseTransition

unwindingEl motor
Cuando algo se lanza durante el render, React sube por la cadena de punteros return buscando quién lo atrape: un Error Boundary si fue un error, un Suspense si fue una promesa. El trabajo a medio hacer de cada Fiber que atraviesa se descarta y nunca llega al commit.

se explica a fondo acá →ver también:Error BoundarySuspense

update queueHookstambién: cola de updates
setState no cambia nada: crea un objeto update y lo mete en una lista enlazada circular, donde queue.pending apunta al último y pending.next al primero. Así se inserta al final en O(1) y se recorre en orden de llegada. La cola se vacía durante la fase render.

se explica a fondo acá →ver también:batchingbaseState

useConcurrencia
use() no es un hook común: no guarda nada en la cadena de hooks, así que no tiene posición que se pueda desalinear. Con una promesa suspende el componente hasta que resuelva; con un contexto se comporta como useContext.

se explica a fondo acá →ver también:SuspenseuseContext

use clientServidor
Todo lo que se importe desde un módulo marcado con use client entra al bundle del cliente. Por eso conviene ponerla lo más abajo posible en el árbol. Todo lo que cruce ese límite como prop tiene que ser serializable: nada de funciones ni de clases.

se explica a fondo acá →ver también:Server Component

useCallbackHooks
useCallback(fn, deps) es exactamente useMemo(() => fn, deps). Sin un memo del otro lado o sin ser dependencia de un efecto, no hace absolutamente nada útil: sólo agrega un nodo a la cadena, un array que asignar y una comparación por render.

se explica a fondo acá →ver también:useMemomemo

useContextHooks
Cuando React atraviesa un Provider empuja su value en una pila del contexto, y lo saca al subir. useContext lee el tope de esa pila. Como no guarda nada en la cadena de hooks, es el único hook que técnicamente podría ir dentro de un condicional.

se explica a fondo acá →ver también:useProvider

useDeferredValueConcurrencia
Usa el mismo mecanismo que useTransition, enganchado al valor en vez de al setter. No es un debounce: no hay espera fija y si llega algo urgente pasa primero. Para que sirva, el componente que recibe el valor diferido tiene que estar memoizado.

se explica a fondo acá →ver también:useTransitiontransition

useEffectHooks
Llamarlo no ejecuta nada: guarda un objeto con create, destroy y deps, marca el Fiber y encola el efecto. React lo vacía después del commit y después de que el navegador pinta, en una tarea aparte. Si no hay un sistema externo del otro lado, probablemente no necesites un efecto.

se explica a fondo acá →ver también:useLayoutEffectcleanupdependency array

useIdHooks
No es un contador global: el id sale de dónde está el componente en el árbol. Por eso el servidor y el cliente generan el mismo y la hydration no se rompe. Nunca lo uses como key de una lista.

ver también:hydration

useLayoutEffectHooks
Misma firma, distinto momento: corre después de aplicar los cambios al DOM y antes de que el navegador pinte. Sirve cuando medís o ajustás layout y el resultado se ve — un tooltip que hay que reposicionar. El precio es latencia: mientras corre, el navegador no puede pintar.

se explica a fondo acá →ver también:useEffectcommit

useMemoHooks
No evita renders: evita recalcular dentro de un render que va a ocurrir igual. Vale la pena si el cálculo es caro de verdad, o si el resultado se pasa a un componente memoizado y lo que importa es la identidad de la referencia.

se explica a fondo acá →ver también:useCallbackmemo

useReducerHooks
Por dentro es idéntico a useState. Lo que cambia es dónde vive la lógica: los componentes declaran qué pasó y el reducer decide qué significa. Eso permite hacer imposibles los estados contradictorios y probar la lógica sin renderizar nada.

se explica a fondo acá →ver también:useState

useRefHooks
Devuelve el mismo objeto { current } en todos los renders. Su queue es null, así que no hay setter, no hay lane y no hay render. Esa ausencia es exactamente su utilidad: guardar cosas que deben sobrevivir entre renders sin provocar uno.

se explica a fondo acá →ver también:ref

useStateHooks
En el código de React, updateState llama a updateReducer con basicStateReducer, que devuelve la acción o la ejecuta si es una función. De ahí sale la función actualizadora: no es una característica especial, es el reducer por defecto haciendo su trabajo.

se explica a fondo acá →ver también:useReducerupdate queue

useSyncExternalStoreServidor
Recibe subscribe, getSnapshot y opcionalmente getServerSnapshot. El snapshot se lee durante el render, no en un efecto: por eso todo lo que se renderiza en esa pasada ve el mismo valor. Cuidado con pasar una función subscribe inline: vuelve a suscribir en cada render.

se explica a fondo acá →ver también:tearingsnapshot

useTransitionConcurrencia
Son dos hooks: un booleano y una función memoizada. setPendiente(true) entra urgente y se ve al instante; lo que dispares dentro del callback y setPendiente(false) entran por TransitionLane. Por eso isPending baja exactamente cuando la transición termina: viajan en la misma lane.

se explica a fondo acá →ver también:transitionuseDeferredValuelane

workInProgressEl motor
El árbol workInProgress se arma durante la fase render. Es interrumpible y descartable: si llega trabajo más urgente, React lo tira y arranca de nuevo sin que el usuario vea nada. Sólo pasa a ser visible cuando el commit lo intercambia con current.

se explica a fondo acá →ver también:render phasecommit