Skip to main content

useTimeout

useTimeout.tsx
import { useEffect, useRef } from 'react'

import { useIsomorphicLayoutEffect } from '..'

function useTimeout(callback: () => void, delay: number | null) {
const savedCallback = useRef(callback)

// Remember the latest callback if it changes.
useIsomorphicLayoutEffect(() => {
savedCallback.current = callback
}, [callback])

// Set up the timeout.
useEffect(() => {
// Don't schedule if no delay is specified.
// Note: 0 is a valid value for delay.
if (!delay && delay !== 0) {
return
}

const id = setTimeout(() => savedCallback.current(), delay)

return () => clearTimeout(id)
}, [delay])
}

export default useTimeout

Usage:

import { useState } from 'react'

import { useTimeout } from '..'

export default function Component() {
const [visible, setVisible] = useState(true)

const hide = () => setVisible(false)

useTimeout(hide, 5000)

return (
<div>
<p>
{visible
? "I'm visible for 5000ms"
: 'You can no longer see this content'}
</p>
</div>
)
}

source: useTimeout