DEV Community

Dante J. Anjos
Dante J. Anjos

Posted on

Como aplicar debounce em input de busca sem lodash

Campo de busca é um componente muito comum em aplicações, geralmente seguem o mesmo fluxo:

  1. Usuário digita um texto no campo
  2. Em seguida é disparado um GET request para alguma API
  3. E por fim a lista de resultados é renderizada em tela

O problema aqui é no segundo passo, onde seria um desperdício de recurso do servidor, fazer uma busca a cada letra digitada, aí que entra a estratégia chamada de debounce.
A idéia é aplicar um delay, antes de fazer a chamada à API, assim evitando chamadas desnecessárias.

Uma solução muito utilizada é o pacote lodash debounce, mas para a finalidade descrita acima a implementação é muito simples usando um setTimeout. O importante é criar uma referência ao timeout antes, para poder reiniciar o delay, pois caso o usuário insira uma nova busca antes da anterior terminar, o timeout continua em execução, então buscas desnecessárias são feitas do mesmo jeito.

const DEBOUNCE_DELAY = 500;

let timeoutRef; // cria a referência ao timeout

const someFetchFunction = (value) => {
  clearTimeout(timeoutRef); // reinicia o timeout

  timeoutRef = setTimeout(() => {
    // faz a chamada à API e outros códigos após o delay
  }, DEBOUNCE_DELAY)
}
Enter fullscreen mode Exit fullscreen mode

Apenas isso já é suficiente para que o debounce funcione sem erros. A função pode ser chamada no campo de input, passando o valor digitado no campo de busca.

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (0)

nextjs tutorial video

Youtube Tutorial Series 📺

So you built a Next.js app, but you need a clear view of the entire operation flow to be able to identify performance bottlenecks before you launch. But how do you get started? Get the essentials on tracing for Next.js from @nikolovlazar in this video series 👀

Watch the Youtube series