在脚本文本内容中反应 setState
React setState inside script text content
大家好!
我正在使用客户端的 ReactJS 将图片功能上传到 Cloudinary,然后我遇到了一个问题。
描述
我在一个组件内添加了一个脚本标签,在 React.useEffect 函数内有一些代码行。在script标签里面,我有Cloudinary return 的数据,当它抓取成功的时候,我想通过脚本内容里面的setState来获取数据。
但是我无法获取数据。
问题
如何在字符串中使用 setState?或者有什么方法可以获取字符串中 returned 的数据?
这是我的代码。
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);
};
}, []);
非常感谢大家!
您可以创建一些全局事件发射器实例(例如使用此 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);
}
}
当然可以考虑改进;这只是解决您问题的方法之一。
大家好!
我正在使用客户端的 ReactJS 将图片功能上传到 Cloudinary,然后我遇到了一个问题。
描述
我在一个组件内添加了一个脚本标签,在 React.useEffect 函数内有一些代码行。在script标签里面,我有Cloudinary return 的数据,当它抓取成功的时候,我想通过脚本内容里面的setState来获取数据。
但是我无法获取数据。
问题
如何在字符串中使用 setState?或者有什么方法可以获取字符串中 returned 的数据?
这是我的代码。
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);
};
}, []);
非常感谢大家!
您可以创建一些全局事件发射器实例(例如使用此 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);
}
}
当然可以考虑改进;这只是解决您问题的方法之一。