You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何写仅执行一次的useEffect且满足react-hooks/exhaustive-deps规则?

方案1:使用useRef存储初始trackingObject(符合eslint校验规则)

你之前使用useRef出现空值大概率是赋值时机不对,正确用法是在组件顶层初始化时就把首次传入的props.trackingObject存入ref,后续props变更不会更新ref的值:

export default function Component(props){
  // 组件首次渲染时存入初始值,仅执行一次
  const initialTracking = React.useRef(props.trackingObject);

  React.useEffect(()=>{
    const _updateSession = async () => {
      const tracking = initialTracking.current;
      // 原有业务逻辑完全不变
      const formData = new URLSearchParams();
      formData.append('trackingCode', tracking.trackingCode);
      formData.append('sessionCode', tracking.sessionCode);
      formData.append('content', trackingStage);

      try {
        const req = await fetch(`https://example.com/tracking/${tracking.id}/`, {
          method: 'PUT',
          body: formData,
        })
        const res = await req.json();

        switch (req.status) {
          case 200:
            props.setQuestion('trackingObject', res);
            break
        }

      } catch (err) {
        console.log(err)
      }
    }
    _updateSession()
  },[]) // 空依赖仅执行一次,eslint无告警,因为effect内部仅使用了稳定的ref对象

  return (
  <>
    {/* 其他渲染逻辑 */}
  </>)
}

方案2:显式跳过eslint规则校验(官方认可的合法处理方式)

如果你明确确认该effect不需要响应任何依赖变化、仅需执行一次,可以直接加注释跳过当前行的规则校验:

React.useEffect(()=>{
  // 原有业务逻辑完全不变
},[]) // eslint-disable-line react-hooks/exhaustive-deps

两种方案都可以实现需求,方案1完全遵循eslint规则,方案2更简洁,适用于你明确知道不需要响应依赖变化的场景。


内容的提问来源于stack exchange,提问作者Firdan Machda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:36:06