useCallback
O useCallback é um Hook que retorna uma versão memorizada de uma função (callback) que só muda se uma das suas dependências for alterada.
Como funciona?
Ele evita que funções sejam recriadas a cada renderização do componente pai, o que é crucial quando passamos funções para componentes filhos que utilizam React.memo ou quando a função é usada como dependência em outros Hooks.
javascript
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);Quando usar?
- Passagem de funções para componentes filhos otimizados: Se um componente filho usa
React.memoe recebe uma função via prop, essa função deve ser memorizada comuseCallbackpara evitar renderizações desnecessárias. - Dependências de outros Hooks: Se você define uma função que será usada dentro de um
useEffect, memorizá-la evita que o efeito rode em todo ciclo de renderização.
Exemplo de Uso:
tsx
function UserListRaw({ onItemPress }: { onItemPress: (id: string) => void }) {
// Este componente só re-renderiza se onItemPress mudar
return <FlatList data={[]} renderItem={() => null} onSelected={onItemPress} />;
}
const UserList = React.memo(UserListRaw);
// No componente Pai
function ParentComponent() {
const handlePress = useCallback((id: string) => {
console.log('Selecionado:', id);
}, []); // Nunca muda
return <UserList onItemPress={handlePress} />;
}Quando NÃO usar?
- Componentes simples: Não use
useCallbackem todas as funções. Se o componente filho não for otimizado comReact.memo, o custo de criar a função memorizada pode ser maior que o benefício. - Funções internas de handlers: Se a função é usada apenas dentro do próprio componente e não é passada para frente, não há necessidade de memorização.
Melhores Práticas
- Dependências corretas: Sempre inclua todas as variáveis externas usadas dentro da função no array de dependências.
- Não abuse: A memorização tem um custo de memória. Use-a apenas quando houver um benefício claro de performance ou correção lógica.