logo

Crie seu próprio hook de debounce

Fev 23 • 2min

Nesse post irei mostrar como criar um hook simples de debouce, sem enrolação. Utilizando ReactJS claro!! =)

Primeiro crie uma pasta onde irar ficar seu hook

Path = "/src/hooks/useDebounce"

Após isso vamos criar uma função recebendo um parâmetro, que no caso seria a função que sera chamada no debounce:

export const useDebounce = (
  effect,
) => {}

Porém, para um debounce ficar funcional e necessário de que passemos um delay também, então vamos adicionar o delay nos parâmetros também!

export const useDebounce = (
  effect,
  delay,
) => {}

Como vamos utilizar como hook, vamos aproveitar e utilizar das maravilhas no React nê, vamos adicionar um useEffect para nos ajudar com esse processo de chamar a função, e aproveitar e passar também como parâmetro as dependências que o useEffect vai precisar

import React from 'react'

export const useDebouncedEffect = (
  effect,
  delay,
  deps
) => {
  React.useEffect(() => {
  }, deps)
}

Vamos começar a melhorar nosso useEffect, adicionando um timeout e colocar a nossa função de efeito que sera chamada após o tempo do timeout, e limpando o timeout quando a acontecer a retirada do efeito

export const useDebouncedEffect = (
  effect,
  delay,
  deps
) => {
  useEffect(() => {
    const handler = setTimeout(() => effect(), delay)

    return () => clearTimeout(handler)
  }, [...deps, delay])
}

Pronto, agora seu código está completo.
Para quem usa Typescript vou deixar um código a baixo com as tipagens e também com alguns detalhes importantes!

import { DependencyList, EffectCallback, useEffect } from 'react'

export const useDebouncedEffect = (
  effect: EffectCallback,
  delay: number,
  deps?: DependencyList
) => {
  useEffect(() => {
    const handler = setTimeout(() => effect(), delay)

    return () => clearTimeout(handler)
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [...(deps || []), delay])
}

Observe que as dependências ficaram opcional, mas também tratamos no useEffect.

comente no

twitter