tg-me.com/vuefaq/1161
Last Update:
Решения для проблемы выше
1. Переделать. Перекрестное использование сущностей - архитектурно плохая практика. Каждая должна содержать в себе только свое состояние и логику работы с собой. Если А
использует B
, значит B
- утилитарен по отношению к А
(например, А
- какой-то бизнесовый стор, B
- отвечает за открытие диалогов). Но тогда коду из А
нечего делать в B
.
К созданию сторов / модульных рефов надо подходить так же ответственно, как к проектированию схемы реляционной базы данных. Это координатный базис, и в нем не может быть перекрестных зависимостей.
Если есть логика, которая работает и с А
, и с B
, то, скорей всего, она прикладная для этих сторов, и должна лежать в отдельной сущности (компоненте, композабле, простом или реактивном модуле, сторе).
2. setTimeout
/ nextTick
, как на картинке. Работает и с модульными рефами, но выглядит уродливым костылём
3. Шина событий (eventBus
) для сообщений между сторами. Как самостоятельное решение возможно, но в данном случае опять же костыль.
4. Если refA
в примере вынести в отдельный модуль, то ошибка пропадет. То же самое, скорей всего, справедливо и для сторов, но будет выглядеть неуклюже. Выносить надо не голый стейт, а разделять стор грамотно, по ответственности.
5. Не надо пихать реактивность туда, где можно обойтись без нее. Если переменная B
зависит от А
, и источников изменения А
всего один-два, то необязательно ставить watch
над А
в B
, можно обновлять B
императивно напрямую. Это уберет прямую зависимость от А
в B
(если код в А
уже как-то использует B
), а также повысит читаемость и производительность. В первую очередь касается кода, который работает с бэкенд API
.
Так же приоритетно, как и пункт 1.
#store #reactivity #architecture
BY Vue-FAQ
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/vuefaq/1161