Здравствуйте
у меня есть store (их много) для разных блоков на разных страницах сайта
в store хранится информация в зависимости от параметра, у моем случае города
например на главной странице у меня список популярных товаров (/store/popular.js)
на это же у меня список отзывов (/store/reviews.js)
...
...
все эти данные привязаны к городу, который выбрал человек на сайте
и есть, соответсвенно, в шапке сайта, кнопка смены города
страниц на сайте много почти везде свой store
вопрос
человек зашел на главную - нажал смену города
как мне правильно "пушить событие" чтобы все store которые сейчас используются, те которые есть на текущей странице, взяли себе новую информацию от только что установленного города?
выбор город у меня в компоненте (модальное окно) и оно вызывается в шаблоне (layouts)
проблема в том что, если клиент нажмет смену города на главной странице - я заменяю щас руками store (те вызываю мутации с новым параметром города, который тоже в store хранится) и вызываю я поочередно все store который используются на главной
а если клиент будет на странице "блог", то мне нужно как-то понять какой store сейчас используется в представлении и заменить не "отзывы" или "популярные", а задиспатчить только store с блогом,
но как мне это понять(что обновлять а что можно не обновлять)? какой алгоритм?
те у меня куча страниц, везде свои store и компоненты, а город сменить (поменять index store) можно на любой странице и после его смены контент на странице (текущей) должен поменяться, а при переходе по другим уже нет проблем так как fetch уже ищет с новым city_id не находит и подгружает (но вот как понять какая страница сейчас, какие store она используется и как их обновить?)
Зачем под каждый город свой стор? просто сделай геттеры, которые в зависимости от текущего города будут выдавать отфильтрованные данные. ну или из api перезаполняй стор, или что там тебе удобнее будет.
в store данные по городам (объект, где ключом является id города)
пример
популярные товары (popular.js)
1 => [1,2,3]
2= > [3,4,5]
те для города с id 1 - товары [1,2,3]
те для города с id 2 - товары [3,4,5]
при пером заходе у меня город по умолчанию в в сторах хранится только один ключ
вопрос и состоит в том как правильно перезаполнять?
я же не могу взять и весь стор перезаполнить при смене города, там порядка 30 сторов для разных блоков системы
мне нужно при смене города перезаполнить текущие, а далее (при смене страниц сайта) уже все работает само, метод fetch, который берез текущий стор city, от него получается id города, далее идет по нужным stor и заполняет данные если нет
Александр Панков, менять город не мутацией, а экшеном, в экшене вызывать мутацию и экшены для заполнения других сторов. Это самый простой вариант.
Есть вариант похуже - вызывать экшены заполнение сторов в компоненте смены города.
Есть вариант посложнее - вместе с подключением "дополнительных" сторов вешать плагины для отслеживания мутаций текущего города и в плагине вызывать обновление стора. что-то типа инверсии зависимости тогда получится.
Кажется основная проблема в том, что ты не прочитал про то, что из модуля можно обратиться к корневому хранилищу, соответственно из него - к состоянию/мутациям/действиям других модулей
Антон Антон, конечно экшеном, я меняю город экшеном и внутри него мутация (геттеры есть и простые и сразу с фильтрацией) и весь этот зоопарк присваивается в computed свойство компонентов - best practices
"заполнения других сторов" - у меня суть вопроса в этом - как узнать каких других (мне нужно только активные, а не все)?
p.s.: решил через pub-sub - подписаны только активные - пока все работает
" в экшене вызывать мутацию и экшены для заполнения других сторов"
у меня сторов 30+ если буду заполнять все на бекенд уйдет 30+ запросов и ждать придется минуты...
да и зачем обновлять все, если клиенту нужно например 5 их 30, а 25 из них он никогда не зайдет и они так и будут пустые... зачем тогда их заполнять и дергать впустую бекенд (это и есть суть моего вопроса)?
"Есть вариант похуже - вызывать экшены заполнение сторов в компоненте смены города"
да, вы правы, хуже, не по GRASP\SOLID компонент смены города не должен быть ответственен за стор популярных товаров, например. или отзывов, поэтому в компоненте смены города я вызываю экшен смены города и после него пуляю событие, а уже другие компоненты, подписанные на него - обновляют свои данные в сторах
"Есть вариант посложнее - вместе с подключением "дополнительных" сторов вешать плагины для отслеживания мутаций текущего города и в плагине вызывать обновление стора. что-то типа инверсии зависимости тогда получится."
интересная задача, но моей проблемы не решит (как обновить только активные на текущий момент сторы)
я вообще не вижу, зачем тут эвент бас. в компоненте, отображающем данные, зависящие от города делаем watch на город (он же в сторе), в этом вотче выставляем статус загрузки данных, проверяем, есть ли в сторе данные для города, если нет, вызываем экшен загрузки, по завершению проверки и загрузки - выставляем статус загрузки в "загружено".