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

React Query中useMutation成功时isSuccess与onSuccess的选择及适用时机咨询

useMutation:isSuccess 和 onSuccess 该怎么选?

核心差异先理清

  • onSuccess:和单次mutate调用绑定的回调,请求成功后仅执行一次,能直接拿到请求返回数据,适合处理一次性、和本次调用强绑定的业务逻辑。
  • isSuccess:React Query暴露的状态值,请求成功后变为true并触发组件重渲染,适合需要驱动UI更新、或依赖组件其他状态的后续逻辑。

用 onSuccess 的场景

如果你的逻辑是单次触发、无需和UI渲染绑定的操作,比如跳转页面、弹出一次性提示、调用独立接口,直接用onSuccess最省心:

const {
  mutate: createRoom,
  isLoading,
  isError,
} = useCreateRoom({
  onSuccess: (responseData) => {
    // 跳转新创建的房间详情页
    navigate(`/rooms/${responseData.roomId}`);
    // 弹出成功提示
    alert('房间创建成功,快去邀请好友!');
    // 同步房间列表数据
    syncRoomList();
  },
});

它的优势是逻辑和单次请求强绑定,不会因组件重渲染重复执行,也无需额外处理状态重置。


用 isSuccess 的场景

如果你的逻辑需要和UI状态联动、或依赖组件其他状态,比如显示成功提示组件、刷新页面列表、控制弹窗显示,就用isSuccess:

场景1:在JSX中直接渲染成功提示

const {
  mutate: createRoom,
  isLoading,
  isError,
  isSuccess,
  reset, // 必须用reset重置状态,避免重复触发
} = useCreateRoom();

const handleCreateRoom = (roomData) => {
  reset(); // 点击前重置状态,避免旧状态干扰
  createRoom(roomData);
};

return (
  <div>
    <button onClick={() => handleCreateRoom(roomData)} disabled={isLoading}>
      创建房间
    </button>
    {isSuccess && <div className="success-tip">房间创建成功!</div>}
    {isError && <div className="error-tip">创建失败,请重试</div>}
  </div>
);

场景2:用 useEffect 处理后续逻辑(比如刷新列表)

const {
  mutate: createRoom,
  isSuccess,
  reset,
} = useCreateRoom();
const { mutate: fetchRooms } = useFetchRooms();

// 成功后刷新房间列表
useEffect(() => {
  if (isSuccess) {
    fetchRooms();
    reset(); // 重置状态,避免组件重渲染时重复执行
  }
}, [isSuccess, fetchRooms, reset]);

这里一定要调用reset(),否则只要isSuccess保持true,组件每次重渲染都会触发useEffect内的逻辑。


一句话总结

  • 做一次性、和本次请求强绑定的操作 → 选onSuccess
  • 做和UI联动、依赖组件其他状态的操作 → 选isSuccess

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:23:36