Я пытаюсь выполнить асинхронный вызов при открытии моего модального режима. Мне нужен этот вызов, потому что он извлек изображения, и для получения ответа потребуется около 5 секунд.
Таким образом, модал должен показывать сначала данные, а затем, когда выборка завершена, он также должен показывать данные выборки.
Моя проблема в том, что в момент вызова функции с этим () => {this.fetchImages(id)
она не вызывается. Я предполагаю, что это потому, что функция назначается, а не вызывается.
Но когда я вызываю функцию fetchImages()
без () =>
, я получаю эту ошибку:
Invariant Violation: Minified React error #31
Это мой код, несущественная часть была удалена для простоты:
renderModal = () => {
...
return (
<Modal open={openModal != null} onClose={this.closeModal}
little showCloseIcon={true} styles={modalStyles}>
<div className="item">
...
{() => {this.fetchImages(id)
.then(r => console.log("Fetch result" + r))}}
</div>
</Modal>
);
}
fetchImages = async (id) =>{
console.log("Request started")
try{
let myImages = null;
if(typeof(id) !== 'undefined' && id != null) {
myImages = await fetchImages(id);
console.log("Images: " + myImages);
return (
<div>
{Array.isArray(myImages) && myImages.length !== 0 && myImages.map((item, key) =>
<p>Image name: {item.name}, En device name: {item.name.en_US}</p>
)}
</div>
);
}
} catch (e) {
console.log("Failed")
}
}
РЕДАКТИРОВАТЬ Изменяя код, предложенный jack.benson
и GalAbra
, я столкнулся с проблемой, в которой застрял в бесконечном l oop. Я добавлю новый код:
Как только страница загрузится, renderModal
вызывается в render()
методе:
{this.renderModal()}
Тогда у меня есть кнопка, которая будет показывать мод с Модал содержит строку:
<Modal open={openModal != null} onClose={this.closeModal}
little showCloseIcon={true} styles={modalStyles}>
Вызывается отсюда:
myMethod = (task) => {
...
return (
<div {...attrs}>
...
<button onClick={() => {this.showModal(documents[0])}}>{translate('show_more')} »</button>
</div>
}
</div>
</div>
);};
И часть, чтобы показать модал:
showModal = (document) => {
this.setState({ modalOpen: document });
};
А теперь новый renderModal()
:
renderModal = () => {
const doThing = async () => {
try {
const newImages = await downloadDeviceImages(id);
return { data: newImages };
} catch (e) {
console.log("Failed")
}
};
const test = async (id) => {
const imageData = await doThing(id);
console.log("after", imageData.data);
this.setState({
imageData: imageData.data
});
};
if(typeof(id) !== 'undefined' && id != null) {test(id);}
return (
<Modal open={openModal != null} onClose={this.closeModal}
little showCloseIcon={true} styles={modalStyles}>
<div className="item">
...
<div>
{this.state.imageData.map((item, key) =>
<p>Device name: {item.name}, En device name: {item.name.en_US}</p>
)}
</div>
</Modal>
);
}
Основная часть здесь заключается в том, что кнопка будет нажиматься несколько раз, и у нее может быть разный идентификатор при каждом щелчке, поэтому каждый раз следует делать новый запрос.