React Hooks:在组件内部处理异步setState的正确方法是什么?(uploadProgress axios)

b

我们要并行发布多个文件并显示上传进度。

解决该问题的第一个尝试是在setupProgress回调中使用setState和先前的状态:

const FileUpload = () => {
  const [pendingUploads, setPendingUploads] = useState({});

  // For clarity: files = Record<string, {id: string, progress: string, data: FormData}>
  const handleChange = files => {
    setPendingUploads(files);

    const handleUploadProgress = (progressEvent, id) => {
      const percentCompleted = (progressEvent.loaded * 100) / progressEvent.total;

      // Problem: pendingUploads is always empty, we do not get the updated value from last update 
      setPendingUploads({
        ...pendingUploads,
        [id]: {
          ...pendingUploads[id],
          progress: `${percentCompleted}%`
        }
      });
    };

    files.forEach(file => {
      axios.post("/files", file.data, {
        onUploadProgress: e => handleUploadProgress(e, file.id)
      });
    });
  };

  return (
    <>
      <div>
        {_.map(pendingUpload, (pendingUpload, idx) => (
          <div key={idx}>
            {pendingUpload.id}: {pendingUpload.progress}
          </div>
        ))}
      </div>

      <input multiple type="file" onChange={handleChange} />
    </>
  );
};

endingUploads始终为空,因此进度值一次仅显示1个文件。

正确的方法是什么?到目前为止,我们有2个工作示例:

1)解决方案1

  • 保持待处理上传状态的地图(pendingUploads)
  • 使用handleUploadProgress(axios回调)中的setState触发进度更新(progressUpdate)
  • 更新未决的使用中的上传进度更新更改时生效
const FileUpload = () => {
  const [pendingUploads, setPendingUploads] = useState({});
  const [progressUpdate, setProgressUpdate] = useState({ id: "", value: "" });

  useEffect(() => {
    setPendingUploads({
      ...pendingUploads,
      [progressUpdate.id]: {
        ...pendingUploads[progressUpdate.id],
        progress: progressUpdate.value
      }
    });
  }, [progressUpdate]);

  const handleUploadProgress = (progressEvent, id) => {
    const percentCompleted = (progressEvent.loaded * 100) / progressEvent.total;
    setProgressUpdate({ id, value: `${percentCompleted}%` });
  };

  // files = Record<string, {id: string, progress: string, data: FormData}>
  const handleChange = files => {
    setPendingUploads(files);
    files.forEach(file => {
      axios.post("/files", file.data, {
        onUploadProgress: e => handleUploadProgress(e, file.id)
      });
    });
  };

  return (
    <div>
      <div>
        {_.map(pendingUploads, (pendingUpload, idx) => (
          <div key={idx}>
            {pendingUpload.id}: {pendingUpload.progress}
          </div>
        ))}
      </div>

      <input multiple type="file" onChange={handleChange} />
    </div>
  );
};



2)解决方案2

  • 更改uploadProgress回调中的文件,并使用更改后的值更新组件的状态
const FileUpload = () => {

  const [pendingUploads, setPendingUploads] = useState({});

  // files = Record<string, {id: string, progress: string, data: FormData}>
  const handleChange = files => {
    const handleUploadProgress = (progressEvent, id) => {
      const percentCompleted = (progressEvent.loaded * 100) / progressEvent.total;
      files[id].progress = `${percentCompleted}%`;
      setPendingUploads({ ...files });
    };

    files.forEach(file => {
      axios.post("/files", file.data, {
        onUploadProgress: e => handleUploadProgress(e, file.id)
      });
    });
  };

  return (
    <>
      <div>
        {_.map(pendingUpload, (pendingUpload, idx) => (
          <div key={idx}>
            {pendingUpload.id}: {pendingUpload.progress}
          </div>
        ))}
      </div>

      <input multiple type="file" onChange={handleChange} />
    </>
  );
};

欢迎提供任何反馈或工作示例,以表明针对此特定案例的最佳实践。

谢谢

弗拉德·格拉佐夫(Vlad Glazov)

您不能在响应回调中使用endingUploads const,因为它将引用过时的版本。而是考虑使用以前的状态setState签名,例如:setPendingUploads((prevPendingUploads) => {return {...prevPendingUploads, /* updates here */}}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

React组件未呈现Axios请求的响应

来自分类Dev

使用React Hooks创建具有多个输入的axios帖子

来自分类Dev

使用React Hooks多次获取数据axios-渲染数据

来自分类Dev

如何使用带有React Hooks的axios来发布请求?

来自分类Dev

如何修复Axios获取请求和React Hooks?

来自分类Dev

在 React Hooks useEffects 清理失败中取消 Axios REST 调用

来自分类Dev

使用 React Hooks 获取多个数据 axios

来自分类Dev

使用异步函数REACT createContext返回axios数据

来自分类Dev

如何在react axios中获取内部数组的值

来自分类Dev

React Axios如何正确将config作为参数传递?

来自分类Dev

Axios React - 没有设置状态,我做错了什么?

来自分类Dev

对 React 的这个 axios async/await 请求有什么问题?

来自分类Dev

react native中的axios和fetch有什么区别?

来自分类Dev

无法从React axios帖子以Web API HttpPost方法接收数据

来自分类Dev

在异步调用axios API之后使用带有React Hook和Redux的SetState

来自分类Dev

在React Native组件中处理HTTP响应的正确方法是什么

来自分类Dev

在 React Native Image 组件中处理个人资料图像的正确方法是什么?

来自分类Dev

React的setState是异步的还是什么?

来自分类Dev

React axios多个文件上传

来自分类Dev

在React函数中使用Axios

来自分类Dev

从Firebase获取数据(React,Axios)

来自分类Dev

React 中的 Axios 请求失败

来自分类Dev

React 中的 Axios 多个请求

来自分类Dev

在TypeScript中定义React组件的contextTypes的正确方法是什么?

来自分类Dev

由axios取消令牌引起的useEffect挂钩无限循环[react-hooks / exhaustive-deps]

来自分类Dev

React Hooks:使用axios拦截器显示全局微调器吗?

来自分类Dev

如何从axios处获取带有react函数组件的useState中的数据

来自分类Dev

如何在渲染我的React组件之前让axios获取请求等待

来自分类Dev

如何使用Axios从React功能组件的get请求访问本地主机的数据?

Related 相关文章

  1. 1

    React组件未呈现Axios请求的响应

  2. 2

    使用React Hooks创建具有多个输入的axios帖子

  3. 3

    使用React Hooks多次获取数据axios-渲染数据

  4. 4

    如何使用带有React Hooks的axios来发布请求?

  5. 5

    如何修复Axios获取请求和React Hooks?

  6. 6

    在 React Hooks useEffects 清理失败中取消 Axios REST 调用

  7. 7

    使用 React Hooks 获取多个数据 axios

  8. 8

    使用异步函数REACT createContext返回axios数据

  9. 9

    如何在react axios中获取内部数组的值

  10. 10

    React Axios如何正确将config作为参数传递?

  11. 11

    Axios React - 没有设置状态,我做错了什么?

  12. 12

    对 React 的这个 axios async/await 请求有什么问题?

  13. 13

    react native中的axios和fetch有什么区别?

  14. 14

    无法从React axios帖子以Web API HttpPost方法接收数据

  15. 15

    在异步调用axios API之后使用带有React Hook和Redux的SetState

  16. 16

    在React Native组件中处理HTTP响应的正确方法是什么

  17. 17

    在 React Native Image 组件中处理个人资料图像的正确方法是什么?

  18. 18

    React的setState是异步的还是什么?

  19. 19

    React axios多个文件上传

  20. 20

    在React函数中使用Axios

  21. 21

    从Firebase获取数据(React,Axios)

  22. 22

    React 中的 Axios 请求失败

  23. 23

    React 中的 Axios 多个请求

  24. 24

    在TypeScript中定义React组件的contextTypes的正确方法是什么?

  25. 25

    由axios取消令牌引起的useEffect挂钩无限循环[react-hooks / exhaustive-deps]

  26. 26

    React Hooks:使用axios拦截器显示全局微调器吗?

  27. 27

    如何从axios处获取带有react函数组件的useState中的数据

  28. 28

    如何在渲染我的React组件之前让axios获取请求等待

  29. 29

    如何使用Axios从React功能组件的get请求访问本地主机的数据?

热门标签

归档