Как реализовать облачный виджет загрузки в React? - PullRequest
3 голосов
/ 22 марта 2019

Я пытаюсь использовать Cloudinary Upload Widget в своем приложении React, но у меня возникла проблема. При запуске проекта виджет загрузки появляется сразу, но после закрытия и повторного открытия приложение вылетает и отображает следующее сообщение:

widget.open () не является функцией

Примечание: Загрузка работает правильно

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> 

введите описание изображения здесь

введите описание изображения здесь

1 Ответ

2 голосов
/ 22 марта 2019

Во-первых, давайте разберемся в проблеме. Облачный виджет загрузки определяется в функции рендеринга компонента, и когда этот компонент отображается, он открывает виджет загрузки, поскольку он определен с функциональностью 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 не требует, чтобы виджет передавался в качестве аргумента (поскольку он определен локально в компоненте), и на него также можно ссылаться с помощью ключевого слова this. Обратите внимание, что вам нужно будет включить ключевое слово this для ссылки на текущий компонент.

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

Я включил JSFiddle, показывающий конечный результат: https://jsfiddle.net/danielmendoza/fve1kL53/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...