Как стать автором
Обновить

Комментарии 5

Тут недавно была статья, в которой описывалось управление данными через сервис классы, т.е. есть какой-то глобальный класс, в котором хранятся все данные и методы для конкретного модуля.

Легально ли прокидывать класс как пропсу (в т.ч. через drilling) и уже где надо вызывать методы класса, а не эмитить?

Разрешено все, что не запрещено (или не замечено :D).

Чтобы понять, почему подход с прокидыванием экземпляра класса — плохой, давайте заменим его на нечто знакомое в мире Vue. Экземпляр класса — это ничто иное, как экземпляр родительского компонента, только вынесен в другой файлик. То есть у нас есть состояние, есть методы, которые это состояние меняют.

Если обратиться к документации, где сказано, что мутирование props — это плохо, потому что приводит к боли, получается, что прокидывание самих методов с их последующим вызовом — это плохо и больно.

Используя экземпляр класса в качестве props с последующим мутированием его состояния приведет к тому, что будет сложно отслеживать, кто же дернул этот метод. К тому же в классическом компонентном подходе, каждый компонент — это "черный ящик" с приватной реализацией собственной логики и состояния.

Взаимодействие с компонентами осуществляется за счет публичного интерфейса — props/emits. В большинстве проектов и Vuex (помянем) / Pinia не нужны, так как хранить глобальное состояние отдельно от представления нужно далеко не всегда.

Однако если уж прям хочется вынести логику в сервис, создав франкенштейна во фронтенде с костыльной слоистой архитектурой, то вам в Angular использование Vuex / Pinia будет наилучшим решением, чем придумывать слой данных на коленках. Даже в этом случае нужно будет обеспечивать высокую связанность компонентов и держать store/view слои где-то рядом (посмотрите на Gitlab исходники)

Кратко: Нет, так делать не нужно, так как в долгой перспективе приведет к сильной связности/сложному дебагу и ужасному опыту тестирования

Или помните, как выше мы рассматривали динамическую и статическую передачу данных? Если мы передаем “:is-hawaiian="true"” – это “Boolean”, а если “is-hawaiian="true"”, то это уже значение “String”.

то бишь двоеточие перед именем форсит валидацию типа? У вас столько кавычек в этом месте лишних, что не сразу поймёшь в чём разница.

Когда появляется двоеточие, шаблонизатор воспринимает это как местную переменную, а когда двоеточия нет, это превращается в обычный html-атрибут, который имеет строковое значение

Действительно, кавычки лишние мешали. Спасибо, что обратили внимание, поправили)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий