当我们想要在 useEffect、useLayoutEffect、useInsertionEffect 中执行一段需要访问到最新状态值的逻辑时,我们可以使用 useEffectEvent 来将这段逻辑抽离出来,而无需为副作用添加额外的依赖项
在使用时,我们一定要注意,useEffectEvent 是 React 19.2 中引入的一个全新 API,他的用法比较简单,场景也很单一,仅仅只是为了解决这一个问题而专门设计的 API
因此,我们可以将上一章一分为二的解决方案,使用 useEffectEvent 来代替,完整代码如下所示
直接使用 useEffectEvent 来定义定时器回调函数
01import { useState, useEffect, useRef, useEffectEvent } from 'react';02import RenderCount from './render-count';0304export default function Counter() {05const [count, setCount] = useState(0);06const [step, setStep] = useState(1);07const stepRef = useRef(1);0809const interval = useEffectEvent(() => {10setCount((prevCount) => prevCount + stepRef.current);11});1213useEffect(() => {14const timer = setInterval(interval, 1000);15return () => clearInterval(timer);16}, [])1718function setStepValue(value: number) {19setStep(value);20stepRef.current = value;21}2223return (24<RenderCount count={count} step={step} setStep={setStepValue} />25);26};