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

如何使用react-query useMutation实现多部分文件上传及链式mutation调用

推荐实现方案:使用 mutateAsync 按异步流程处理

React Query 针对这种有先后依赖的 mutation 场景提供了mutateAsync方法,它会将 mutation 执行逻辑包装为标准 Promise,可以直接用常规的async/await写法处理,完全规避作用域冲突问题,逻辑也更清晰。

修改后的onSubmit代码如下:

const onSubmit = async (userData: JsonFormUser) => {
  if (userData.photoType === 'other') {
    const myJsonData : JsonDataUserPhotoOther = {
      data: {
        id: userObject.id,
        type: 'user',
        attributes: {
          photoType: userData.photoType,
          photoName: userData.photoName,
        },
        // 预留Drupal JSON:API要求的文件关联字段
        relationships: {}
      },
    };

    // 上传新图片的逻辑
    if (imageSrc && !imageSrc.includes(baseUrl)) {
      try {
        const myCroppedImgBlob = await getCroppedImg(
          imageSrc,
          croppedAreaPixels,
        );
        // 等待文件上传完成,拿到返回的文件资源信息
        const photoUploadRes = await mutatePhotoFile.mutateAsync(myCroppedImgBlob);
        // 补全用户数据和上传文件的关联关系(Drupal JSON:API要求必须传该字段才能绑定文件)
        myJsonData.data.relationships.field_ref_image = {
          data: {
            type: 'file--file',
            id: photoUploadRes.data.id
          }
        }
        // 上传成功后再执行用户信息更新
        mutateUser.mutate(myJsonData);
      } catch (err) {
        // 上传失败直接触发错误提示
        setShowFileAlert(true);
      }
    } else {
      // 没有新图片需要上传时直接更新用户信息
      mutateUser.mutate(myJsonData);
    }
  }
}

原来的mutatePhotoFile定义不需要做任何修改,全局配置的onSuccess、onError回调仍然会正常执行,和本次调用的逻辑互不冲突。


可选方案:使用单次调用专属回调

如果不想用async/await写法,也可以在调用mutate时传入本次调用专属的onSuccess回调,该回调的作用域可以直接访问onSubmit内的局部变量:

// 上传文件的逻辑修改为
mutatePhotoFile.mutate(myCroppedImgBlob, {
  onSuccess: (response: ResponseMutatePhoto) => {
    // 直接访问局部变量myJsonData,补全文件关联后调用更新接口
    myJsonData.data.relationships.field_ref_image = {
      data: {
        type: 'file--file',
        id: response.data.id
      }
    }
    mutateUser.mutate(myJsonData);
  }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:06:03