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
相关产品推荐
相关产品推荐

