Daniil
ок
Olexandr
По нажатию кнопки в родителе
Olexandr
он должен переписать поле с картинками, записать туда те которые остались (из дочки) и те которые новые (приходят с сервера хоста картинок)
Daniil
т.е. свойства прилетают в стейт родителя а по сабмиту летят на сервак?
Olexandr
т.е. свойства прилетают в стейт родителя а по сабмиту летят на сервак?
По сабмиту эти стейты должны записаться в основной стейт родителя productValue, после чего весь этот productValue должен улететь на бек в качестве тела запроса
Olexandr
Просто когда я пишу setState - и тут же пытаюсь его вызвать - возвращается старое значение.
Olexandr
Что логично, так реакт работает
Olexandr
вот эти изменения где хранишь?
В стейте родителя. Они автоматом всегда актуализируются из дочки
Daniil
один момент я не пойму
Daniil
1 ты говоришь что дочерний сразу меняет стейт родителя
Olexandr
да, временный.
Daniil
2 По сабмиту эти стейты должны записаться в основной стейт
Olexandr
Который потом нужно записать родителю в другой стейт в качестве поля
Daniil
да, временный.
это мне кажется кастыль уже
Daniil
мне кажется ты перемудрил с архитектурой решения
Daniil
зачем тебе временный стейт?
Olexandr
это мне кажется кастыль уже
Просто изначальное состояние дочки - приходит из родителя. Список ссылок, дочка их рендерит и содержит функционал удаления и добавления новых. При удалении записываются стейты - список удаленных и список оставшихся. При добавлении новых - запрос на сервер, возврат ссылок (но только по нажатию на сабмит в родителе) В основном стейте нужно все эти изменения собрать в кучу, записать, и отправить весь стейт на бек
VlA.do
Гайз привет! Хочу оставить комментарий на 1 видео в пути самурая, а не даёт, пишет JSON.parse: unexpected end of data at line 1 column 5719 of the JSON data Что за ... ???
Olexandr
а дочерний компонент точно нужен?
Родитель и так уже 300 строк
Daniil
а понял
Olexandr
Проблема только в одном. Как записать стейт и его же в актуальном варианте отправить на бек
Daniil
я понимаю, просто в момент обновления стейта ты уже знаешь каким он будет
Olexandr
Раньше юзЕффект спасал всю ситуацию, но в данном случае не канает
Daniil
осталось выяснить в каком месте это реализовать
Daniil
вот я и не понял какой метод у тебя ключевой
Daniil
походу это сабмит
Olexandr
осталось выяснить в каком месте это реализовать
Да, юзеффект - легкое решение, но в данном случае у productValue - очень много динамических свойств, которые меняются при вводе в инпуты
Olexandr
в нем мне нужно отправить картинки на сервер, получить ссылки, положить их в стейт, потом в этот же стейт положить оставшиеся картинки (которые были изначально и не были удалены). и запушить всю эту шнягу на бек
Daniil
а где у тебя отсылка на бэк?
Olexandr
Пока нету, я только консоль логами смотрю че имею на данный момент
Daniil
а
Olexandr
Вот отправка картинок на сервер, возврат ссылок и запись в стейт - отрабатывает моментально
Olexandr
if (addedImgFiles.length !== 0) { const uploadResult = UploadApiAxios(addedImgFiles); await axios .all(uploadResult).then(response => { console.log("inside: ", response); const newUrls = productValue.imageUrls; response.forEach(item => { newUrls.push(item.data.url); }); setProductValue({...productValue, imageUrls: newUrls}) }) .catch(error => { console.log(error); }); }
Olexandr
потому что async await
Daniil
а полный код фунции?
Olexandr
onst submitHandler = async () => { if (deletedImgUrls.length !== 0) { setProductValue({...productValue, imageUrls: remainingImgUrls}); } if (addedImgFiles.length !== 0) { const uploadResult = UploadApiAxios(addedImgFiles); await axios .all(uploadResult).then(response => { const newUrls = productValue.imageUrls; response.forEach(item => { newUrls.push(item.data.url); }); setProductValue({...productValue, imageUrls: newUrls}) }) .catch(error => { console.log(error); }); } console.log("Images: ", remainingImgUrls); console.log("Deleted urls: ", deletedImgUrls); console.log("Added Files:", addedImgFiles); console.log("Updated Product: ", productValue); onClose(); };
Olexandr
console.log("Updated Product: ", productValue); - включает в себя изменения из запроса
Olexandr
А это if (deletedImgUrls.length !== 0) { setProductValue({...productValue, imageUrls: remainingImgUrls}); } ——- нет, специфика реакта
Olexandr
Вместо консоль логов будет отправка стейта на бек
Daniil
ок ща вникну
Olexandr
Убрал лишнего, чтоб не мешалось
Daniil
вот тут я так понял отсылка картинок на сервер и получение их новых url ? await axios .all(uploadResult).then(response => { console.log("inside: ", response);
Olexandr
Да, это вызов промиса
Daniil
console.log("Images: ", remainingImgUrls); console.log("Deleted urls: ", deletedImgUrls); console.log("Added Files:", addedImgFiles); console.log("Updated Product: ", productValue); а потом после этого ты хочешь еще отправить эти поля на сервер?
Olexandr
Отправка в другом месте, но эта штука работает и стейт записывает, если вызвать консоль лог то стейт будет правильным
Olexandr
Остальные консоль логи - это чтоб смотреть что прилетает все правильно и актуально
Daniil
ясно
Olexandr
Еще буду делать запрос на сервер картинок чтоб удалить - удаленные, но это уже дело техники, там ничего сложного
Daniil
if (deletedImgUrls.length !== 0) { setProductValue({...productValue, imageUrls: remainingImgUrls}); } то есть у тебя это не успевает отработать
Olexandr
if (deletedImgUrls.length !== 0) { setProductValue({...productValue, imageUrls: remainingImgUrls}); } то есть у тебя это не успевает отработать
Он то отрабатывает, но возвращает старое значение т.к. небыло перерендера
Daniil
по логике тебе нужно так 1) получить что-то с сервера 2) сделать на фронте изменения 3) отослать изменения 4) на сервере сделать все что нужно удалить / добавить
Olexandr
вот это мне кажется совсем лишнее
ну, тут как бы сотни товаров, сотни картинок, если они не нужны то чтоб их не хранить на севрере - принято решение удалять. Но то к делу не относится.
Daniil
каждый раз слать по отдельности не лучший вариант хотя зависит от специфики
Olexandr
картинки - один сервер, а все описание и ссылки - в монго
Daniil
у бэка есть база картинок и файлы
Daniil
картинки - один сервер, а все описание и ссылки - в монго
ну и что бэк же имеет к ним доступ и к базе и к картинкам?
Olexandr
у бэка есть база картинок и файлы
у бека есть только база с товарами со всеми занчениями и ссылками на картинки, сами картинки лежать на 3rd party
Daniil
ну хорошо но ты же не фронтом картинки удаляешь? или фронтом?
Daniil
я имею физически
Olexandr
Картинки на cloudinary, работа с добавлением туда файлов - работает через фронт )
Daniil
а с удалением?
Olexandr
Удаление потом прикрутим, тут проблем не будет. Надеюсь (наш "специалист" осилил только такой вариант) :)
Anonymous
Картинки на cloudinary, работа с добавлением туда файлов - работает через фронт )
А как бек тогда знает что картинка была зааплоаджена на сервер?
Olexandr
Daniil
я про что вообще т.е. есть у тебя товары в монго и там ардреса картинки, ты обновил товар прислал данные, сервер перед тем как записать что-то в монго сравнил не нужно ли удалить картинки которых больше нет удалил и записал новые данные в базу не нужен еще один запрос
Olexandr
Вот я беку и хочу засабмитить массив с ссылками, он без проблем создается. Проблема в изменении массивы (уже существующих ссылок)
Olexandr
он получает ссылки и все
Daniil
следить за базой должен бэк и за удалением всякого
Olexandr
следить за базой должен бэк и за удалением всякого
верю, но человек который это пилил - сделал через фронт.