айтемов, картинки отображаются не сразу, а появляются по мере загрузки. и так получается, что картинки появляются в шахматном порядке (из-за веса картинки). а нужно, чтобы скелетон (или спиннер) крутился, пока загрузятся айтемы, потом полностью картинки и отобразить все разом.
сделал такое решение:
у компонента item, к тегу img повесил @load=“loaded”, как только картинка загрузится, функция loaded эмитит в itemList, в itemList, все это аккумулируется и сравнивается с длинной массива с айтемами. как только значения равняются, isLoading переходит false и отключается спиннер и отображаются айтемы.
<spinner v-if=“isLoading”/>
<div v-show=“!isLoading && items.length”>
<item v-for=“item in items”/>
</div>
такое решение норм?
работать то работает. просто думается что решение не очень
Ну а какие альтернативы? В целом логично, что айтемс лист собирает в себе инфу о том скока в нем айтемов отчитались о своей загрузке и отображает это спиннером
я лично решение вижу на стороне бэка, чтобы сделать два варианта картинок: thumbnail и full и для списка юзать thumbnail) но такой возможности щас нет)
через promise all грузишь?
что ты имеешь ввиду?
Есть метод Promise.all() в которую закидываешь функцию которая должна будет выполниться большая работа типа импорта данных с одного сервера на другой.
айтемсы грузятся разом, ссылки на картинки вставляются в каждом айтеме
тогда можно какой-то компьютед на массив обьектов создать когда картинка загрузилась - прокидывать на верх ивент и Vue.$set'ом сетить loaded=true а компьютед будет что-то типо того imagesLoaded() { return items.every(item=>item.loaded); }
Обсуждают сегодня