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

如何在react-query的useQueries中使用onSuccess方法?

实现useQueries的全局onSuccess回调

由于useQueries本身没有提供类似useQuery的全局onSuccess配置,我们可以通过React的useEffect监听所有请求的状态,在所有API调用成功完成后触发回调逻辑。

修改后的代码实现

import { useQueries } from "react-query";
import axios from "axios";
import { useEffect } from "react";

const fetchFriend = id => {
  return axios.get(`http://localhost:4000/friends/${id}`);
};

const useDynamicFriends = (friendIds, onSuccess) => {
  const queryResult = useQueries(
    friendIds.map(id => {
      return {
        queryKey: ["friends", id],
        queryFn: () => fetchFriend(parseInt(id)),
      };
    })
  );

  const isLoading = queryResult.some(result => result.isLoading);
  const allRequestsSuccess = queryResult.every(result => result.isSuccess);
  const hasError = queryResult.some(result => result.isError);

  useEffect(() => {
    // 当所有请求完成、无加载中状态、全部成功且传入了回调时执行
    if (!isLoading && allRequestsSuccess && !hasError && onSuccess) {
      const allFriendData = queryResult.map(res => res.data);
      onSuccess(allFriendData);
    }
  }, [isLoading, allRequestsSuccess, hasError, onSuccess, queryResult]);

  return { isLoading, queryResult, hasError };
};

export default useDynamicFriends;

组件中使用示例

const FriendList = () => {
  const friendIds = [1, 2, 3];

  const handleAllLoaded = (allData) => {
    console.log("所有好友数据加载完成:", allData);
    // 这里可以执行后续逻辑,比如数据聚合、状态更新等
  };

  const { isLoading, queryResult } = useDynamicFriends(friendIds, handleAllLoaded);

  if (isLoading) return <div>加载中...</div>;

  return (
    <ul>
      {queryResult.map((res, idx) => (
        <li key={idx}>{res.data?.name}</li>
      ))}
    </ul>
  );
};

逻辑说明

  • 新增onSuccess参数,用于接收全局成功回调函数
  • 通过allRequestsSuccess判断所有请求是否都成功,hasError排查是否有请求失败
  • 利用useEffect监听状态变化,满足条件时触发回调并传入所有请求返回的数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:05:24