Почему (Flux) управление состоянием не использует статические функции вместо именованных свойств - PullRequest
0 голосов
/ 08 ноября 2018

В настоящее время я решаю переключиться с angularJS на response.js или vue.js. Цель состоит в том, чтобы использовать его, включая Typescript, чтобы убедиться, что все является Typesafe.

Испытав vuex и redux, я заметил, что они не используют нормальные функции, а вместо этого используют некоторую форму именования строк для функций.

Redux, например, проверяет определенную функцию через переключатель в редукторах Image 1

Vuex использует постоянные объекты, где функции в этом объекте могут вызываться через функции, которые принимают строку и полезную нагрузку

Image 2 Image 3

В чем причина этого? Почему-то кажется, что это будет больно, когда вам придется рефакторинг, и вы чувствуете, как способ делать ошибки при программировании из-за опечаток.

Почему нормальный класс со статическими функциями не справляется с этой задачей (или другим, возможно, лучшим решением) Image 4

1 Ответ

0 голосов
/ 08 ноября 2018

Redux и Vuex создают единый экземпляр store из объявленного набора модулей, который отвечает за отправку / совершение зарегистрированных действий / мутаций, для которых тип должен быть указан как значение string. При масштабировании приложения использование действий / мутаций становится довольно распространенным, а использование простых строк значительно снижает предсказуемость мутаций состояний.

Использование констант, таких как:

export const ADD_PORTFOLIO = 'ADD_PORTFOLIO'

позволяет составить список всех доступных мутаций состояний в отдельном файле, подобном списку, что обеспечивает четкое понимание возможных изменений, избегая опечаток внутри модулей хранилища и позволяя IDE и редакторам кода автоматически заполнять или выделять недопустимые ссылки на константные типы. Что сокращает время отладки и было бы невозможно при простых string с. Это не требуется, и это не изобретение упомянутых библиотек. По тем же причинам хорошо работает с глобально вызванными событиями (например, Node EvenEmitter , Electron ipcRenderer и т. Д.).

И Redux, и Vuex хранят состояние в простых объектах и ​​требуют, чтобы их API были определены как функции (каждая со своей собственной архитектурой), которые будут объединены в один экземпляр хранилища. Это служит для предоставления оперативных обновлений об изменениях состояния, предупреждений, когда состояние видоизменяется за пределами мутаций или отправленное действие / мутация не зарегистрированы. Мое мнение таково, что этот подход эффективен при отсутствии безопасности типов, без которой обе библиотеки изначально предназначены для использования.

Например, в Vuex, если вы решили вызвать действие или мутацию из другого модуля, вы должны использовать dispatch (для действий) или commit (для мутаций) с типом, на который ссылается полный путь к модулю:

dispatch('profile/addPortfolio', payload, { root: true })
commit('profile/ADD_PORTFOLIO', payload, { root: true })

Это означает, что оба вызова должны быть выполнены с помощью store методов экземпляра и должны быть зарегистрированы в текущем store экземпляре, а не импортировать и вызывать действие или мутацию модуля напрямую.

В случае, если Typescript интегрирован в проект, можно использовать структуру класса или декораторы для магазина и его модулей. Опять же, классы будут скомпилированы в соответствии с архитектурой библиотеки магазина, но улучшат опыт разработки.

Что касается Vuex, то для использования с Typescript стоит проверить следующие библиотеки:

TLDR Такая архитектура определяется упомянутыми библиотеками для использования без безопасности типов, но все же допускает реактивность и централизованную мутацию состояний. Константы помогают гарантировать, что действия / мутации регистрируются в экземпляре магазина, повышают предсказуемость и обеспечивают автозаполнение для редакторов кода.

...