Rafael 🌵
Николаич
Rafael 🌵
Anonymous
Нет, так не работает
Rafael 🌵
С vuetify работает
Anonymous
Не знаю насчёт славы, но мне странно почему оно вообще так работает и не видит
Николаич
Ну мне так его работа видится. Могу ошибаться.
Dmitry
всем привет
Dmitry
а кто-нибудь знает, как подписаться на несколько мутаций?
Dmitry
что-то вроде Observable.zip, или prmise.all
Николаич
Dmitry
ну я подписываюсь на мутации в компоненте
Dmitry
чтобы получить стейт
Dmitry
Dmitry
вот так
Николаич
Dmitry
хмм
Николаич
Для чего? Почему не mapGetters?
Dmitry
опа
Dmitry
а что за mapGetters?
Николаич
Николаич
Срочно читать доку по vuex
Anonymous
Dmitry
так увидел
Николаич
То что вы делаете, обычно в плагинах vuex используют
Dmitry
но если я замапаю getters, я например не смогу подписываться на определенные мутации
Dmitry
и сделать что-нибудь, когда получу юзера
Николаич
Dmitry
ну например, мне нужно сделать кастомный объект в компоненте, из юзера и чего-нибудь еще
Dmitry
пример, есть джоба, есть юзеры, в джобе есть только ids юзеов
Dmitry
аага
Николаич
Dmitry
да это сработает
Dmitry
окай, это сработает, только тогда в динамическом гетере, мне придется вызывать функцию и в user и в job
Yaroslav 🇺🇦
Рафик, чой-то ты меня тут главным метателем чата фикалиями в нубов назвал?)
Yaroslav 🇺🇦
go кстати зарелизися в 1.9
Dmitry
ну окс, запилю на геттерах, вроде ничего сложного
Lev
А накой экшены?
Yaroslav 🇺🇦
@Romshark asyncData нужна только для ssr, всё что она далжна делать это асинхронный action
И вложеность компонент там предусмотрена вот таким механизмом для сервера:
const matchedComponents = router.getMatchedComponents()
await Promise.all(matchedComponents.map(
async Component => {
if (Component.asyncData) {await Component.asyncData({store})}
}
))
matchedComponents получает массив всех вложенных компонент, дадьше мы проходимся по массиву и дергаем асинхронные action каждого компонента (если он конечно есть)
В Вашем случае, вы хотите изолировать данные компонента от сторы. Вся изоляция спокойно помещается в хук created.
Изолированные данные в этом хуке поместятся в data компонента и будут работать как на сервере так и на клиенте. Вам не нужен asyncData.
Другое дело в скорости. Как я бы сделал. Это просто мысли и их нужно реализовывать и смотреть на перфоманс. В хуке креатед я бы грузил только те данные, которые сходу может тыкнуть анон. В случае магазина, он должен получить первый листинг товаров, например первые 20 скю отсортированные как на надо. Дальше в этом же хуке я бы подгрузил по 20 товаров относительно фльтров. Типо самые популярные, самые дорогие, самые дешевые. И всё. Такую отдачу я бы оставил как для серверной части так и для клиентской.
А дальше, учитывая что у вас по категории может быть, как вы писали больше 10 000 товаров, уже в хуке mounted (только для клиента) начал бы грузить все товары по категории. И грузил бы их в базу браузера, для удобства потом сортировки и выборки.
И вот тут, если анон получив стандартную выдачу товаров, быстро прокрутит вниз до пагинации и нажмет цифру 2, чтобы получить следующую порцию товаров, а они у нас не подгружены я бы уже вываливал спиннер, до полной загрузки коллекции товаров в базу браузера.
Может сумбурно, но как то так.
Lev
Вот... у меня есть список сущностей, которые надо отобразить в списке (но не просто так, там сложное преобразование, считайте что каждую сущность нужно провести через какую то функцию, чтобы получить данные для отображения).
С сервака прилетает сообщение "добавилось 3 элемента в список"
Как мне это обработать?
Как мне кажется - через computed, который пересчитает весь список (старые + 3) и вернет новый массив. Но.. может есть способ лучше?
Lev
Или в обработчике экшена при получении +3 так же обновить подготовлунную строктуру для списка?
Yaroslav 🇺🇦
Это же vue, как хотите так и делайте.
Первое, как с сервака прилетают сообщения? Есть механизм по интервалу или это действие юзера?
Если первый вариант, то можно отобразить сообщение юзеру, что добавлено что-то новое, и мол показать? Если да то пихать новый массив в computed и не ибать себе моцк.
Также можно сделать action который буде плюсовать новые данные к старым, а в компонентах он будет перерисовываться по геттеру.
Yaroslav 🇺🇦
Геттер опять же можно поставить как в компютед, так и в хук жизненного цикла
Lev
новый массив в computed - оно ведь тогда будет перерендеривать по всему массиву а не только по добавленным?
Yaroslav 🇺🇦
конечно
Lev
Ну вот... вся фишка запарывается
Lev
"Также можно сделать action который буде плюсовать новые данные к старым, а в компонентах он будет перерисовываться по геттеру."
Вот я так и сделал. При получении я смотрю что добавилось и push
Lev
просто.... если бы можно было бы эту логику воткнуть не в action а в компоненте - было бы конечно интересно
Lev
Но не суть
Lev
В таком случае компонент тупо отвечает за отрисовку, ни за что более, тоже верно.
Lev
А вся переделка данных и набивание стейта - в редьюсере
Lev
простите, обработчике экшена
Lev
Простое добавление анимации очень доставляет
Lev
И чистый DOM тоже =)
Yaroslav 🇺🇦
Можно и в компоненте. Тянуть первыве данные в хуке креатед, ложить их в дата, потом в моунтед повесть интервал, который в случае добавления чего будет пушить новое в то же свойство даты. В чем проблема?
Yaroslav 🇺🇦
Если на li в v-for повесить анимацию через транзишин vue или с библиотеки анимейтед, то каждый новый ли будет добавляться с анимацией
Yaroslav 🇺🇦
Николаич
Roman
@Romshark asyncData нужна только для ssr, всё что она далжна делать это асинхронный action
И вложеность компонент там предусмотрена вот таким механизмом для сервера:
const matchedComponents = router.getMatchedComponents()
await Promise.all(matchedComponents.map(
async Component => {
if (Component.asyncData) {await Component.asyncData({store})}
}
))
matchedComponents получает массив всех вложенных компонент, дадьше мы проходимся по массиву и дергаем асинхронные action каждого компонента (если он конечно есть)
В Вашем случае, вы хотите изолировать данные компонента от сторы. Вся изоляция спокойно помещается в хук created.
Изолированные данные в этом хуке поместятся в data компонента и будут работать как на сервере так и на клиенте. Вам не нужен asyncData.
Другое дело в скорости. Как я бы сделал. Это просто мысли и их нужно реализовывать и смотреть на перфоманс. В хуке креатед я бы грузил только те данные, которые сходу может тыкнуть анон. В случае магазина, он должен получить первый листинг товаров, например первые 20 скю отсортированные как на надо. Дальше в этом же хуке я бы подгрузил по 20 товаров относительно фльтров. Типо самые популярные, самые дорогие, самые дешевые. И всё. Такую отдачу я бы оставил как для серверной части так и для клиентской.
А дальше, учитывая что у вас по категории может быть, как вы писали больше 10 000 товаров, уже в хуке mounted (только для клиента) начал бы грузить все товары по категории. И грузил бы их в базу браузера, для удобства потом сортировки и выборки.
И вот тут, если анон получив стандартную выдачу товаров, быстро прокрутит вниз до пагинации и нажмет цифру 2, чтобы получить следующую порцию товаров, а они у нас не подгружены я бы уже вываливал спиннер, до полной загрузки коллекции товаров в базу браузера.
Может сумбурно, но как то так.
о, спасибо за детяльный разбор! а вот почему я из доки ничего про created не слыхал?
Yaroslav 🇺🇦
о, спасибо за детяльный разбор! а вот почему я из доки ничего про created не слыхал?
Все хуки жизненного цикла есть в документации. По ssr есть уточнение что где и как работает.
Вообще пишите сюда свои реализации будет интересно почитать.
МЫ тоже пилим платформу торговою. Но там специфики поменьше и я сейчас експерементирую с веб-воркерами, которые возвращают генератор, и пагинация это тупо некст генератора. Но это пока просто баловство
Владимир
Всем привет. У меня такой вопрос!
Работаю с Firebase, и надо получить данные об авторизованном пользователе глобально, хочу поместить ответ в хранилище. Все мои попытки тщетны, т.к. данные поступают через некоторое время и не получается обновить значение переменной.
Как лучше поступить в такой ситуации, чтобы можно было обновить значение переменной когда будет получен ответ от Firebase?
Yaroslav 🇺🇦
Через промис
Владимир
Через промис
Спасибо, попробую через обещания сделать, но мне кажется есть другой способ, средствами самого vue?
Yaroslav 🇺🇦
Если кажеться, то есть довольно популярный описанный в анекдотах и фильмах совет
Владимир
Yaroslav 🇺🇦
vue = js = асинхронное программирование
Roman
Roman
Roman
https://github.com/vuejs/vetur/issues/261
Roman
однако так и не понял что собственно не так..
Roman
вроде как код рабочий, и даже если v-for="(key, product) in products" напишу - та-же херня
Roman
я точно всё правильно делаю в плане кода и это лишь баг linter'а?
Roman
хотя да, эт походу баг
Rafael 🌵
Нет, ты неправильно делаешь
Roman