Я хочу:
- загрузить изображение в браузер (я делаю это с помощью React Dropzone. Моя нижеприведенная функция
uploadImage
запускается при перетаскивании файла в Dropzone.) - считайте изображение как фактическое изображение с помощью API-интерфейса FileReader.
- сохраните файл изображения и метаданные изображения в состояние, используя React Hooks.
- выполните вызов API, который передает это изображение всервер.
Я пытаюсь подтвердить, что у меня есть изображение на шаге 4, но я не могу подтвердить это с помощью сообщений консоли.Я каким-то образом застрял с исходными значениями состояния, несмотря на сообщения журнала, показывающие, что состояние уже обновлено.
Я попытался добавить дополнительные асинхронные элементы ко всем, и я завернул вещи в обещания.Я могу подтвердить, что функция readImage
в порядке.Я могу подтвердить последовательность выполнения readImage
, saveImage
, setGraphic
в saveImage, а затем файл console.log в uploadImage
, который должен иметь обновленные значения, но не имеет.
const [graphic, setGraphic] = useState({ ...nullGraphic });
const readImage = async (img) => {
const reader = new FileReader();
return new Promise((resolve, reject) => {
reader.onerror = () => reader.abort();
reader.onabort = () => reject(new DOMException('Problem parsing input file.'));
reader.onload = () => resolve(reader.result);
reader.readAsDataURL(img);
});
};
const saveImage = async (img) => {
const imageRead = await readImage(img);
console.log(imageRead);
await setGraphic({
...graphic,
image: imageRead,
imageName: img.name,
imageType: img.type,
});
};
const uploadImage = async (img) => {
await saveImage(img);
console.log(graphic);
});
render() {
console.log(graphic);
return( <some dom> )
}
это моя странная последовательность консоли:
Form.js:112 starting saveImage
Form.js:95 (snipped value of imageRead)
Form.js:237 {snipped updated values of graphic}
Form.js:114 done with saveImage
Form.js:116 {snipped original values of graphic}
Моя теория
Хук useState делает что-то напуганное.Процесс копирует значение при запуске, а не читает его всякий раз, когда читается console.log, поэтому функция uploadImage
получает исходные значения ловушки useState за время существования этого процесса.