【问题标题】:REACT, Axios, cloudinary push mutliple secure_urls Into State Array In ReactjsREACT,Axios,cloudinary 将多个安全 url 推送到 Reactjs 中的状态数组中
【发布时间】:2021-10-30 09:44:22
【问题描述】:

我一直在尝试将 Cloudinary 数据响应中的 secure_urls 推送到 React 状态数组,但没有成功。当我将新图像添加到 dropzoneArea 时,以前的 url 会添加到数组中,因此会复制 url。 有谁知道如何解决这个问题?

状态

 const [fileItems, setFileItems] = useState([]);

放置区

<DropzoneArea
      acceptedFiles={["image/jpeg", "image/png", "image/bmp", "image/jpg"]}
      onChange={handleFiles}
      onDelete={handleDeleteFile}
      showFileNames
      filesLimit={5}
    />
const handleFiles = (files) => {
    files.forEach((file) => {
      const formData = new FormData();
      formData.append("file", file);

      formData.append("upload_preset", process.env.REACT_APP_UPLOAD_PRESET);

      return Axios.post(
        `https://api.cloudinary.com/v1_1/${process.env.REACT_APP_CLOUD_NAME}/upload`,
        formData,
        {
          headers: { "X-Requested-With": "XMLHttpRequest" },
        }
      )
        .then((res) => {
          const fileUrls = res.data.secure_url;
          setFileItems(fileItems=>[...fileItems,fileUrls])
        })
        .catch((err) => {
          console.log(err.message);
        });
    });
  };

【问题讨论】:

    标签: reactjs axios cloudinary react-dropzone


    【解决方案1】:

    我发现您的代码存在多个问题。对于初学者,您有一个带阴影的变量名,请参阅fileItems 的重复项

    const [fileItems, setFileItems] = useState([]);
    ...
    setFileItems(fileItems=>[...fileItems,fileUrls])
    

    此外,在循环内调用 setState 是一种反模式。您可以尝试像这样重构您的代码:

    const handleFiles = (files) => {
        const fileUrlArray = [];
        files.forEach((file) => {
          const formData = new FormData();
          formData.append("file", file);
    
          formData.append("upload_preset", process.env.REACT_APP_UPLOAD_PRESET);
    
          return Axios.post(
            `https://api.cloudinary.com/v1_1/${process.env.REACT_APP_CLOUD_NAME}/upload`,
            formData,
            {
              headers: { "X-Requested-With": "XMLHttpRequest" },
            }
          )
            .then((res) => {
              const fileUrls = res.data.secure_url;
              fileUrlArray.push(fileUrls);
            })
            .catch((err) => {
              console.log(err.message);
            });
        });
        setFileItems(prevState => [...prevState, ...fileUrlArray])
      };
    

    不确定它是否会修复您的代码,但这是一个开始。

    【讨论】:

    • 其实我只是觉得你最后只需要一个setFileItems(fileUrlArray),而不是传播prevstate。
    • 这对我有用setFileItems(fileUrlArray)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2018-06-21
    • 2016-03-26
    • 1970-01-01
    • 2016-11-26
    • 2019-08-18
    相关资源
    最近更新 更多