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

如何在SWR获取到有效数据时仅执行一次操作(useEffect实现)

解决方案

这里提供两种可靠的方式实现「SWR获取到有效数据时仅执行一次操作」的需求:

方法一:使用useRef标记执行状态 + useEffect

通过useRef存储是否已执行的标记,结合依赖data的useEffect,仅在data有效且未执行过操作时触发逻辑:

import { useSWR } from 'swr';
import { useEffect, useRef } from 'react';

// 假设你的fetcher函数定义如下
const fetcher = (url) => fetch(url).then(res => res.json());

const YourComponent = () => {
  const { data, isLoading, mutate } = useSWR(`${process.env.BACKEND_BASE_URL}/resource`, fetcher);
  // 标记是否已经执行过目标操作
  const hasRun = useRef(false);

  useEffect(() => {
    // 仅当data存在且未执行过操作时执行
    if (data && !hasRun.current) {
      // 这里替换成你需要执行一次的操作
      console.log('仅执行一次的操作:', data);
      // 标记为已执行,后续data变更不再触发
      hasRun.current = true;
    }
  }, [data]);

  return (
    <div>
      {isLoading ? '加载中...' : '数据加载完成'}
    </div>
  );
};

export default YourComponent;

方法二:利用SWR的onSuccess回调

SWR内置了请求成功后的回调onSuccess,结合useRef标记,同样可以实现仅执行一次的效果:

import { useSWR } from 'swr';
import { useRef } from 'react';

const fetcher = (url) => fetch(url).then(res => res.json());

const YourComponent = () => {
  const hasRun = useRef(false);

  const { data, isLoading, mutate } = useSWR(
    `${process.env.BACKEND_BASE_URL}/resource`,
    fetcher,
    {
      onSuccess: (fetchedData) => {
        if (!hasRun.current) {
          // 执行仅需一次的操作
          console.log('仅执行一次的操作:', fetchedData);
          hasRun.current = true;
        }
      }
    }
  );

  return (
    <div>
      {isLoading ? '加载中...' : '数据加载完成'}
    </div>
  );
};

export default YourComponent;

说明

  • useRef的current属性不会触发组件重渲染,适合用来存储这种执行状态标记。
  • 如果你的场景中永远不会触发mutate重新请求数据,方法二可以去掉useRef标记,直接在onSuccess里执行操作即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:12:50