javascript - 如何在 React 中实现 Cloudinary Upload Widget?

标签 javascript reactjs file-upload cloudinary

我正在尝试在我的 React 应用程序中使用 Cloudinary 上传小部件,但我遇到了问题。 运行项目时,Upload Widget 立即出现,但关闭并再次打开时,应用程序崩溃并显示以下消息:

widget.open() is not a function

注意: 上传正常

import React, { Component } from 'react';
import './App.css';

class App extends Component {
  showWidget = (widget) => {
    widget.open();
  }

  checkUploadResult = (resultEvent) => {
    if(resultEvent.event === 'success'){
      console.log(resultEvent)
    }
  }
  render() {
      let widget = window.cloudinary.openUploadWidget({
      cloudName: "*********",
      uploadPreset: "tryingfirsttime"},
      (error, result) => {this.checkUploadResult(result)});

    return (
      <div className="App">
        <button onClick={this.showWidget}> Upload file</button>
      </div>
    );
  }
}

export default App;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<script src="https://widget.cloudinary.com/v2.0/global/all.js" type="text/javascript"></script> 

enter image description here

enter image description here

最佳答案

首先,让我们了解一下这个问题。 Cloudinary 上传小部件在组件的渲染函数中定义,当该组件被渲染时,它将打开上传小部件,因为它定义了 openUploadWidget 的功能。其次,小部件仅在渲染函数的范围内定义,无法在其外部访问,因此错误 widget.open() is not a function

为了解决这些问题,我首先将小部件定义为局部变量或状态的一部分。这是通过将构造函数作为组件的一部分来完成的:

constructor(props) {
   super(props)

   // Defined in state
   this.state = { . . . }

   // Defined as local variable
   this.widget = myLocalVariable
}

接下来要做的是在创建 Cloudinary 上传小部件的实例时,使用 createUploadWidget 而不是 openUploadWidget,以允许控制何时打开小部件。

constructor(props) {
   super(props)
   // Defined in state
   this.state = {
      widget: cloudinary.createUploadWidget({
         cloudName: 'my_cloud_name', 
         uploadPreset: 'my_preset'}, 
         (error, result) => { 
            if (!error && result && result.event === "success") { 
               console.log('Done! Here is the image info: ', result.info); 
            }
         }
      })
    }
    // Defined as local variable
    this.widget = cloudinary.createUploadWidget({
       cloudName: 'my_cloud_name', 
       uploadPreset: 'my_preset'}, (error, result) => { 
         if (!error && result && result.event === "success") { 
           console.log('Done! Here is the image info: ', result.info); 
         }
       }
    })
 }

最后,showWidget click 事件不需要将小部件作为参数传递(因为它是在组件中本地定义的)并且也可以使用 this 关键字进行引用。请注意,您需要包含关键字 this 以引用当前组件。

showWidget = () => {
  this.widget.open();
}

我包含了一个显示最终结果的 JSFiddle: https://jsfiddle.net/danielmendoza/fve1kL53/

关于javascript - 如何在 React 中实现 Cloudinary Upload Widget?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55292306/

相关文章:

javascript - React/Redux 无法读取未定义的属性 'setCurrent'

java - 无法调试 java.lang.NoClassDefFoundError : com/google/inject/internal/util/$Preconditions

javascript - 与 addEventListener 绑定(bind)

javascript - Cypress对象与JQuery对象,cy.wrap函数的作用

reactjs - React Material UI 手动触发 Select

javascript - "arrow function expected no return value"带有清理功能的useEffect

jquery - 如何检查输入文件是否为空,如果使用 jquery 选择了 png 格式,还显示警告

java - 内容类型不允许 : fileUpload in Struts 2

javascript - 使用 javascript 填充 svg 内的图案

javascript - 让 Jest 与 Babel 7.0.0 配合使用时出现问题