实现一个 useTimeout
Hook,该 Hook 在指定的延迟后调用回调函数。
请注意,由于初始调用,Hook 可以使用不同的值再次调用:
useTimeout
的主要好处是,如果组件在计时器过期之前卸载,则不必手动清除调用 clearTimeout()
。
export default function Component() {const [loading, setLoading] = useState(true);useTimeout(() => setLoading(false), 1000);return (<div><p>{loading ? 'Loading' : 'Ready'}</p></div>);}
callback: () => void
:在指定的延迟后要调用的函数delay: number | null
:在调用回调函数之前的延迟时间(以毫秒为单位)。如果为 null
,则清除超时无。
实现一个 useTimeout
Hook,该 Hook 在指定的延迟后调用回调函数。
请注意,由于初始调用,Hook 可以使用不同的值再次调用:
useTimeout
的主要好处是,如果组件在计时器过期之前卸载,则不必手动清除调用 clearTimeout()
。
export default function Component() {const [loading, setLoading] = useState(true);useTimeout(() => setLoading(false), 1000);return (<div><p>{loading ? 'Loading' : 'Ready'}</p></div>);}
callback: () => void
:在指定的延迟后要调用的函数delay: number | null
:在调用回调函数之前的延迟时间(以毫秒为单位)。如果为 null
,则清除超时无。
useTimeout
钩子可以使用 useEffect
实现,以使用 setTimeout
创建一个持续 delay
毫秒的超时。当组件卸载或 delay
为 null
时,超时将被清除。
callback
使用 useRef
存储,以便待处理的计时器可以引用最新的回调。
import { useRef, useEffect } from 'react';export default function useTimeout(callback: () => void, delay: number | null) {const latestCallback = useRef(callback);latestCallback.current = callback;useEffect(() => {if (delay === null) {return;}const timeoutId = setTimeout(() => {latestCallback.current();}, delay);return () => {clearTimeout(timeoutId);};}, [delay]);}
console.log()
语句将显示在此处。