Los patrones de render props y slots dejan que los padres posean el comportamiento mientras que los hijos son dueños del markup - así compones árboles de navegación profunda sin apilar componentes wrapper alrededor de cada pantalla. Los render props pasan estado a través de una función; los patrones de slot (como en layouts de Expo Router) reservan un espacio donde se renderiza la ruta secundaria activa.
import type { ReactNode } from "react";type RenderProp<T> = (value: T) => ReactNode;interface DataRendererProps<T> { data: T; children: RenderProp<T>;}// Render prop nombrado cuando children ya se usa para composicióninterface ListProps<T> { items: T[]; renderRow: RenderProp<{ item: T; index: number }>; keyExtractor: (item: T) => string;}
Prefiere nombres explícitos (renderHeader, renderEmpty) cuando children también es un nodo React válido.
Los padres genéricos (AsyncList<T>) mantienen los tipos de elemento fluyendo hacia el parámetro de callback.
Escribe el argumento de renderizado como una interfaz para que las pantallas obtengan autocompletado en reload, status, etc.
Funciones de renderizado en línea en listas - children={(ctx) => <Row {...ctx} />} definida dentro de un padre recrea la función en cada renderizado y puede derrotar memo. Solución: Eleva un componente hijo estable o pasa renderRow desde useCallback.
Infierno de wrappers en navegadores - Anidar cinco proveedores en cada _layout.tsx oscurece la pantalla real. Solución: Empuja proveedores transversales al layout raíz; usa slots solo para chrome de nivel de ruta.
Usar render props cuando un hook es suficiente - Toggle con solo isOn/toggle no necesita un hijo de función si cada llamador renderiza la misma fila. Solución: Exporta useToggle y una fila tonta - ver Custom Hooks for UI Logic.
Llamar hooks dentro de render props - children={() => { const x = useFoo(); ... }} viola las Reglas de Hooks. Solución: Mueve las llamadas de hook a un componente hijo renderizado por la función.
Slot sin flex - Olvidar flex: 1 en el contenedor de slot produce pantallas secundarias en blanco o recortadas. Solución: Da al wrapper de slot flex: 1 en layouts de pantalla completa.
Bucles de recarga de render prop asincrónico - useEffect(() => reload(), [items]) cuando reload establece items causa una búsqueda infinita. Solución: Depende de claves estables; carga una vez en mount o en acciones de usuario explícitas.
children sin tipo como Función - children: Function pierde la seguridad de tipos. Solución:children: (state: ToggleRenderProps) => ReactNode.