#说明
React中 可以处理 setInterval 的 Hook, 此处为ahooks的摘录
一、直接上代码
import { useEffect, useRef } from 'react';function useInterval(fn: () => void,delay: number | null | undefined,options?: {immediate?: boolean;},): void {const immediate = options?.immediate;const fnRef = useRef<() => void >();fnRef.current = fn;useEffect(() => {if (delay === undefined || delay === null) return;if (immediate) {fnRef.current?.();}const timer = setInterval(() => {fnRef.current?.();}, delay);return () => {clearInterval(timer);};}, [delay]);}export default useInterval;
二、解释
Ⅰ - useRef
const refContainer = useRef(initialValue);
useRef返回一个可变的 ref 对象,其.current属性被初始化为传入的参数(initialValue)。返回的 ref 对象在组件的整个生命周期内持续存在。一个常见的用例便是命令式地访问子组件:
function TextInputWithFocusButton() {const inputEl = useRef(null);const onButtonClick = () => {// `current` 指向已挂载到 DOM 上的文本输入元素inputEl.current.focus();};return (<><input ref={inputEl} type="text" /><button onClick={onButtonClick}>Focus the input</button></>);}本质上,
useRef就像是可以在其.current属性中保存一个可变值的“盒子”。你应该熟悉 ref 这一种访问 DOM 的主要方式。如果你将 ref 对象以
<div ref={myRef} />形式传入组件,则无论该节点如何改变,React 都会将 ref 对象的.current属性设置为相应的 DOM 节点。然而,
useRef()比ref属性更有用。它可以很方便地保存任何可变值,其类似于在 class 中使用实例字段的方式。这是因为它创建的是一个普通 Javascript 对象。而
useRef()和自建一个{current: ...}对象的唯一区别是,useRef会在每次渲染时返回同一个 ref 对象。请记住,当 ref 对象内容发生变化时,
useRef并不会通知你。变更.current属性不会引发组件重新渲染。如果想要在 React 绑定或解绑 DOM 节点的 ref 时运行某些代码,则需要使用回调 ref 来实现。
三、使用
```tsx import React, { useState } from ‘react’; import { useInterval } from ‘useInterval’;
export default () => { const [count, setCount] = useState(0); const [interval, setInterval] = useState(1000);
useInterval( () => { setCount(count + 1); }, interval, { immediate: true }, );
return (
count: {count}
interval: {interval}
