Componentes compostos permitem que os chamadores montem UIs flexíveis - abas, cards, grupos de campos de formulário - a partir de partes nomeadas que compartilham estado implícito. O componente pai possui activeIndex ou isExpanded; filhos como Tabs.List e Tabs.Panel o leem através do context, em vez de passar props através de todos os slots.
// Instável - novo objeto a cada renderização re-renderiza todos os consumidores<TabsContext.Provider value={{ activeIndex, setActiveIndex }}>// Estável - memoize; estabilize setters com useCallback na raizconst value = useMemo( () => ({ activeIndex, setActiveIndex }), [activeIndex, setActiveIndex]);
Apenas descendentes que leem um campo alterado re-renderizam quando o context atualiza.
Divida context "quente" e "frio" se necessário: TabsStateContext + TabsActionsContext para árvores grandes.
Para atualizações de alta frequência (controladores animados), prefira um hook ou ref em vez de context.
Guarda de provedor ausente - Usar Tabs.Tab fora de <Tabs> lê context null e se comporta silenciosamente de forma incorreta. Correção: Lance um erro em useTabsContext() com uma mensagem clara.
Valor de context instável - value={{ activeIndex, setActiveIndex }} inline re-renderiza cada consumidor a cada renderização do pai. Correção: Use useMemo para o valor; envolva setters em useCallback.
Abas baseadas em índice quebram na reordenação - index={2} codificado à mão muda quando o marketing insere uma aba. Correção: Use IDs de string ("account") como chaves internamente para as abas; mapeie para índice se necessário.
Montagem de todos os painéis de uma vez - Gráficos pesados em abas ocultas ainda executam efeitos e prejudicam o desempenho da rolagem. Correção: Retorne null de TabPanel inativo ou monte sob demanda na primeira ativação.
Componente "Deus" - Um mega-<Form> com 20 subpartes se torna mais difícil do que props. Correção: Divida em compostos FieldGroup, SelectField e DateField em vez de uma única exportação.
Estilização dentro de primitivos - Incorporar cores da marca em Tabs.Tab bloqueia aplicativos white-label. Correção: Aceite props style / textStyle ou um hook className para consumidores NativeWind.
Estado de acessibilidade não conectado - Abas sem accessibilityRole="tab" e estado selected confundem VoiceOver/TalkBack. Correção: Espelhe os papéis ARIA da web em Pressable de acordo com as orientações da plataforma.