Crie seu próprio hook de debounce
Em vez de usar bibliotecas de terceiros, porque não criar você mesmo seu próprio hook de debounce.
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.