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