Los componentes compuestos permiten que los llamadores ensamblen interfaces flexibles - pestañas, tarjetas, grupos de campos de formulario - desde partes nombradas que comparten estado implícito. El componente padre posee activeIndex o isExpanded; los componentes hijo como Tabs.List y Tabs.Panel lo leen a través del contexto en lugar de hacer prop drilling a través de cada slot.
// Inestable - nuevo objeto cada render re-renderiza todos los consumidores<TabsContext.Provider value={{ activeIndex, setActiveIndex }}>// Estable - memoriza; estabiliza setters con useCallback en la raízconst value = useMemo( () => ({ activeIndex, setActiveIndex }), [activeIndex, setActiveIndex]);
Solo los descendientes que leen un campo cambiado se re-renderizan cuando el contexto se actualiza.
Divide contexto hot y cold si es necesario: TabsStateContext + TabsActionsContext para árboles grandes.
Para actualizaciones de alta frecuencia (scrubbers animados), prefiere un hook o ref en lugar de contexto.
Guardia de provider faltante - Usar Tabs.Tab fuera de <Tabs> lee el contexto null y se comporta mal silenciosamente. Arreglo: Lanza un error en useTabsContext() con un mensaje de error claro.
Valor de contexto inestable - El valor inline value={{ activeIndex, setActiveIndex }} re-renderiza cada consumidor en cada renderizado del padre. Arreglo: Memoriza el valor con useMemo; envuelve setters en useCallback.
Pestañas basadas en índice se rompen al reordenar - index={2} codificado se desplaza cuando marketing inserta una pestaña. Arreglo: Clave pestañas por id de string ("account") internamente; mapea a índice si es necesario.
Montar todos los panels a la vez - Gráficos pesados en tabs ocultos siguen ejecutando efectos y hieren el perf de scroll. Arreglo: Devuelve null del TabPanel inactivo o lazy-mount en primera activación.
Dios compuesto - Uno mega-<Form> con 20 sub-partes se vuelve más difícil que props. Arreglo: Divide en FieldGroup, SelectField, y DateField compuestos en lugar de una exportación.
Estilos dentro de primitivos - Hornear colores de marca en Tabs.Tab bloquea aplicaciones white-label. Arreglo: Acepta props style / textStyle o un hook className para consumidores de NativeWind.
Estado de accesibilidad no cableado - Pestañas sin accessibilityRole="tab" y estado selected confunden VoiceOver/TalkBack. Arreglo: Espeja los roles ARIA web en Pressable por guía de plataforma.