Render props e padrões de slot permitem que os pais controlem o comportamento enquanto os filhos controlam a marcação - assim, você compõe árvores de navegação profundas sem empilhar componentes wrapper em torno de cada tela. Render props passam estado através de uma função; padrões de slot (como nos layouts do Expo Router) reservam um espaço onde a rota filha ativa é renderizada.
import type { ReactNode } from "react";type RenderProp<T> = (value: T) => ReactNode;interface DataRendererProps<T> { data: T; children: RenderProp<T>;}// Render prop nomeada quando children já é usado para composiçãointerface ListProps<T> { items: T[]; renderRow: RenderProp<{ item: T; index: number }>; keyExtractor: (item: T) => string;}
Prefira nomes explícitos (renderHeader, renderEmpty) quando children também é um nó React válido.
Genéricos pais (AsyncList<T>) mantêm os tipos de item fluindo para o parâmetro do callback.
Tipar o argumento de renderização como uma interface para que as telas obtenham autocompletar em reload, status, etc.
Funções de renderização inline em listas - children={(ctx) => <Row {...ctx} />} definidas dentro de um pai recriam a função a cada renderização e podem derrotar memo. Correção: Eleve um componente filho estável ou passe renderRow de useCallback.
Inferno de wrappers em navegadores - Aninhar cinco provedores em cada _layout.tsx obscurece a tela real. Correção: Empurre provedores transversais para o layout raiz; use slots apenas para cromagem de nível de rota.
Usar render props quando um hook é suficiente - Toggle com apenas isOn/toggle não precisa de um filho de função se cada chamador renderiza a mesma linha. Correção: Exporte useToggle e uma linha boba - veja Hooks Personalizados para Lógica de UI.
Chamar hooks dentro de render props - children={() => { const x = useFoo(); ... }} viola as Regras de Hooks. Correção: Mova as chamadas de hook para um componente filho renderizado pela função.
Slot sem flex - Esquecer flex: 1 no contêiner do slot resulta em telas filhas em branco ou cortadas. Correção: Dê ao wrapper do slot flex: 1 em layouts de tela inteira.
Loops de recarga de render prop assíncrona - useEffect(() => reload(), [items]) quando reload define items causa busca infinita. Correção: Dependa de chaves estáveis; carregue uma vez na montagem ou em uma ação explícita do usuário.
children não tipado como Função - children: Function perde a segurança de tipo. Correção:children: (state: ToggleRenderProps) => ReactNode.