Daniil
ок
Olexandr
По нажатию кнопки в родителе
Olexandr
он должен переписать поле с картинками, записать туда те которые остались (из дочки) и те которые новые (приходят с сервера хоста картинок)
Daniil
т.е. свойства прилетают в стейт родителя а по сабмиту летят на сервак?
Olexandr
Просто когда я пишу setState - и тут же пытаюсь его вызвать - возвращается старое значение.
Olexandr
Что логично, так реакт работает
Daniil
Daniil
Daniil
один момент я не пойму
Daniil
1 ты говоришь что дочерний сразу меняет стейт родителя
Olexandr
да, временный.
Daniil
2 По сабмиту эти стейты должны записаться в основной стейт
Olexandr
Который потом нужно записать родителю в другой стейт в качестве поля
Daniil
мне кажется ты перемудрил с архитектурой решения
Daniil
зачем тебе временный стейт?
Olexandr
это мне кажется кастыль уже
Просто изначальное состояние дочки - приходит из родителя.
Список ссылок, дочка их рендерит и содержит функционал удаления и добавления новых. При удалении записываются стейты - список удаленных и список оставшихся. При добавлении новых - запрос на сервер, возврат ссылок (но только по нажатию на сабмит в родителе)
В основном стейте нужно все эти изменения собрать в кучу, записать, и отправить весь стейт на бек
VlA.do
Гайз привет! Хочу оставить комментарий на 1 видео в пути самурая, а не даёт, пишет JSON.parse: unexpected end of data at line 1 column 5719 of the JSON data
Что за ... ???
Daniil
Olexandr
Daniil
а понял
Olexandr
Проблема только в одном.
Как записать стейт и его же в актуальном варианте отправить на бек
Daniil
я понимаю, просто в момент обновления стейта ты уже знаешь каким он будет
Olexandr
Раньше юзЕффект спасал всю ситуацию, но в данном случае не канает
Daniil
осталось выяснить в каком месте это реализовать
Daniil
вот я и не понял какой метод у тебя ключевой
Daniil
походу это сабмит
Olexandr
Daniil
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
Olexandr
Остальные консоль логи - это чтоб смотреть что прилетает все правильно и актуально
Daniil
ясно
Olexandr
Еще буду делать запрос на сервер картинок чтоб удалить - удаленные, но это уже дело техники, там ничего сложного
Daniil
if (deletedImgUrls.length !== 0) {
setProductValue({...productValue, imageUrls: remainingImgUrls});
}
то есть у тебя это не успевает отработать
Daniil
Olexandr
Daniil
по логике тебе нужно так
1) получить что-то с сервера
2) сделать на фронте изменения
3) отослать изменения
4) на сервере сделать все что нужно удалить / добавить
Olexandr
вот это мне кажется совсем лишнее
ну, тут как бы сотни товаров, сотни картинок, если они не нужны то чтоб их не хранить на севрере - принято решение удалять. Но то к делу не относится.
Daniil
каждый раз слать по отдельности не лучший вариант хотя зависит от специфики
Olexandr
Daniil
Olexandr
картинки - один сервер, а все описание и ссылки - в монго
Daniil
у бэка есть база картинок и файлы
Olexandr
Daniil
ну хорошо но ты же не фронтом картинки удаляешь? или фронтом?
Daniil
я имею физически
Olexandr
Картинки на cloudinary, работа с добавлением туда файлов - работает через фронт )
Daniil
а с удалением?
Olexandr
Удаление потом прикрутим, тут проблем не будет. Надеюсь (наш "специалист" осилил только такой вариант) :)
Anonymous
Olexandr
Daniil
я про что вообще т.е. есть у тебя товары в монго и там ардреса картинки, ты обновил товар прислал данные, сервер перед тем как записать что-то в монго сравнил не нужно ли удалить картинки которых больше нет удалил и записал новые данные в базу не нужен еще один запрос
Olexandr
Вот я беку и хочу засабмитить массив с ссылками, он без проблем создается. Проблема в изменении массивы (уже существующих ссылок)
Olexandr
Olexandr
он получает ссылки и все
Daniil
следить за базой должен бэк и за удалением всякого