在脚本文本内容中反应 setState

Posted

技术标签:

【中文标题】在脚本文本内容中反应 setState【英文标题】:React setState inside script text content 【发布时间】:2021-09-18 21:40:37 【问题描述】:

大家好! 我正在从客户端使用 ReactJS 将图像上传到 Cloudinary,然后我遇到了一个问题。 说明 我在 React.useEffect 函数内添加了一些代码行的组件内的脚本标记。在 script 标签里面,我有 Cloudinary 获取成功后返回的数据,我想通过在脚本内容中使用 setState 来获取数据。 但我无法获取数据。 问题 如何在字符串中使用 setState?或者有什么方法可以获取字符串中返回的数据?

这是我的代码。

React.useEffect(() => 

const scriptCloudinaryCdn = document.createElement('script');
scriptCloudinaryCdn.src =
  'https://upload-widget.cloudinary.com/global/all.js';
scriptCloudinaryCdn.async = true;



const widgetScript = document.createElement('script');

 // I wanted to get the data that was returned from this
const widgetContent = `  var myWidget = cloudinary.createUploadWidget(
  cloudName: 'cloudname', 
  uploadPreset: 'upload_preset', (error, result) =>  
    if (!error && result && result.event === "success") 
       // this is the data from Cloudinary, I wanted to carry this with setState
      console.log('Done! Here is the image info: ', result.info); 
  
    
  
)

document.getElementById("upload_widget").addEventListener("click", function()
    myWidget.open();
  , false);`;

widgetScript.text = widgetContent;

document.body.appendChild(scriptCloudinaryCdn );
document.body.appendChild(widgetScript);

   return () => 
     document.body.removeChild(scriptCloudinaryCdn );
     document.body.removeChild(widgetScript);
   ;
, []);

非常感谢你们!

【问题讨论】:

使用一些全局事件发射器怎么样?订阅 useEffect 内的 react 组件中的事件,然后在成功回调中发出事件? 【参考方案1】:

您可以创建一些全局事件发射器实例(例如使用此library),订阅 React 组件中的事件,然后从小部件的成功回调中发射事件。

如果不想使用全局发射器,可以使用 DOM 事件发射器,如下所示:

const [uploadedImageData, setUploadedImageData] = useState(null);

useEffect(() => 
  const onImageUplaoded = (event) => 
    setUploadedImageData(event.detail);
  ;

  document.getElementById("upload_widget").addEventListener('imageuploaded', onImageUploaded);

  return () => 
    document.getElementById("upload_widget").removeEventListener('imageuploaded', onImageUploaded);    
  
, []);

您可以在小部件的成功回调中执行以下操作:

uploadPreset: 'upload_preset', (error, result) =>  
  if (!error && result && result.event === "success") 
    const event = new CustomEvent('imageuploaded',  detail: result.info );
    document.getElementById("upload_widget").dispatchEvent(event);
  

当然你可以考虑改进;这只是解决您问题的方法之一。

【讨论】:

谢谢,这是个好主意,我会试试的!

以上是关于在脚本文本内容中反应 setState的主要内容,如果未能解决你的问题,请参考以下文章

对 useEffect 挂钩内的多个 setState() 调用做出反应批量更新

未处理的拒绝(TypeError):无法读取反应中未定义的属性“setState”(firestore)

调用 React Setstate 回调但延迟渲染

选择反应路由器时的setState(React)

this.setState 是不是在反应中返回承诺

在功能组件中使用回调对 setState 进行反应