Это же PHP десятилетней давности — запрос к БД и отрисовка HTML в одном файле. Только PHP уже тогда за это ругали и рекомендовали разделять ответственности, а в мире реакта это оказывается ново, модно и удобно.
Обилие способов отписаться и отсутствие единого способа это сделать — один из множества минусов RxJS для управления состоянием. Сначала проблему создали, потом её решаем костылями. Идиоматичный RxJS это автоматический subscribe и автоматические отписки. Ручные подписки — это неправильное использование RxJS, которое, увы, встречается повсеместно.
Общий размер Mobx + mobx-react-lite на современном React — 15.4 + 1.8кб, а не 50. Ссылки на bundlephobia в посте выше. MST даёт дополнительные инструменты вроде рантайм проверки типов, нормализации из коробки и time travel, что вряд ли нужно в простом приложении.
Mobx в gzip весит 15кб. А обвязка к реакту — 1.8кб. Если версия реакта позволяет использовать хуки, то можно использовать официальный mobx-react-lite вместо mobx-react.
автор предложил достаточно крутое решение, чтобы избавить redux от бойлерплейта
Спасибо, что поделились своим опытом. Проблема inject в том, что его нельзя типизировать без костылей, примеры костылей описаны в этой статье. С хуками компонент Player может выглядеть так, у него нет проблем с типизацией:
В MST как раз предлагают использовать flow и генераторы, вместо async/await: mobx-state-tree.js.org/concepts/async-actions
Тоже самое доступно в Mobx. Я не тут не вижу проблемы — код на yield выглядит и читается так же как на async/await.
У реакта на 100% типизированы шаблоны если использовать TypeScript. В том же Angular, который написан на TS и постоянно этим кичится, до сих пор нет способа на уровне типов гарантировать обязательность пропса, не говоря уже про более сложные сценарии, которые поддерживает TSX:
— Наследование пропсов: stackoverflow.com/a/45677919
— Generic компоненты: react-typescript-cheatsheet.netlify.app/docs/advanced/guides/generic_components
— Типизация children
А как расстановка отступов вручную помогает держать мозг в тонусе? Это монотонная работа которую проще полностью делегировать компьютеру: prettier.io/docs/en/why-prettier.html
Геттер, который заменяет вычисляемое значение. Его логика работы отличается от Vue
Вы тут умолчали о том, что в примере на Vue у вас есть мемоизация и автоматическое вычисление зависимостей (благодаря Transparent Reactive Programming). В примере на Angular функция будет пересчитываться на каждый вызов Change Detection, что гораздо менее эффективно. Не говоря уже о том, что во Vue вам не нужно делать подписку на интервал вне Zone.js, а в Angular вы рано или поздно столкнётесь с необходимостью так делать. Я как-то добавлял таймер обратного отсчёта в Angular приложение, таймер был вверху дерева компонентов и на каждый тик триггерил CD рекурсивно у всех компонентов ниже. Тут ещё спасает OnPush, но во Vue это не нужно.
Он использует библиотеку для реактивного программирования RxJS, без которой также обойтись нельзя.
Без RxJS можно прекрасно обойтись даже в Angular, посмотрите например Mobx-Angular. Я был на проекте, который писали фулстеки с уклоном в бекенд, и им было очень тяжело совладать с RxJS и его операторами, в коде были все возможные антипаттерны RxJS — вложенные подписки, отсутствие отписок, непонимание разницы между switchMap/mergeMap/concatMap и как следствие трудновоспроизводимые баги. Mobx зашёл на ура разработчикам из-за привычной модели программирования, писать код стало проще. Ну и вот возьмём ваш пример на RxJS, в нём ведь тоже есть проблемы:
— Лишний BehaviorSubject. Вместо того, чтобы считать количество кликов через оператор scan вы ввели состояние, которое мутируете вручную. Это императивный подход. Такой код люди пишут постоянно, потому что ломать голову операторами RxJS сложно.
— Подписка на интервал в шаблоне у вас скорее всего через async pipe, а это опять будет триггерить CD на каждый тик. На интервалы/таймеры нужно подписываться вне Zone.js
Вся эта ненужная сложность, отсутствие девтулзов и ещё вагон проблем с типизацией (она в Angular слишком щадящая) и побудили меня отказаться от этого фреймворка в пользу React.
Ну и хорошо, что наследование не будет работать, вместо него лучше композиция: en.wikipedia.org/wiki/Composition_over_inheritance
Необходимость помнить о потере this — лишняя когнитивная нагрузка, а бесконечный поток статей про контекст в JS тому подтверждение.
Не хотите классы — не используйте:
Проблема в том, что тут чуть ли не каждый второй пост про стейт-менеджер это презентация своего велосипеда или обёртки над Redux:
— Организация reducer'а через стандартный класс
— Redux-symbiote — пишем действия и редьюсеры почти без боли
— Redux — пересмотр логики reducer'a и actions
— Оверинжинирг 80 уровня или редьсюеры: путь от switch-case до классов
Люди решают проблемы, которые уже давно решены другими инструментами, проверенными временем. Поэтому появляются люди, рассказывающие об этих инструментах.
Аналогично для dispatch'а. Просто — это когда counter.increment(), а не хуки на все экшны:
Тоже самое доступно в Mobx. Я не тут не вижу проблемы — код на yield выглядит и читается так же как на async/await.
Ключевые слова те же «eslint», «prettier», «husky», «lint-staged». Зачем писать ещё одну?
— Наследование пропсов: stackoverflow.com/a/45677919
— Generic компоненты: react-typescript-cheatsheet.netlify.app/docs/advanced/guides/generic_components
— Типизация children
Было бы интересно взглянуть на ваш пример из-за которого завис компилятор TypeScript.
Без RxJS можно прекрасно обойтись даже в Angular, посмотрите например Mobx-Angular. Я был на проекте, который писали фулстеки с уклоном в бекенд, и им было очень тяжело совладать с RxJS и его операторами, в коде были все возможные антипаттерны RxJS — вложенные подписки, отсутствие отписок, непонимание разницы между switchMap/mergeMap/concatMap и как следствие трудновоспроизводимые баги. Mobx зашёл на ура разработчикам из-за привычной модели программирования, писать код стало проще. Ну и вот возьмём ваш пример на RxJS, в нём ведь тоже есть проблемы:
— Лишний BehaviorSubject. Вместо того, чтобы считать количество кликов через оператор scan вы ввели состояние, которое мутируете вручную. Это императивный подход. Такой код люди пишут постоянно, потому что ломать голову операторами RxJS сложно.
— Подписка на интервал в шаблоне у вас скорее всего через async pipe, а это опять будет триггерить CD на каждый тик. На интервалы/таймеры нужно подписываться вне Zone.js
Вся эта ненужная сложность, отсутствие девтулзов и ещё вагон проблем с типизацией (она в Angular слишком щадящая) и побудили меня отказаться от этого фреймворка в пользу React.
Необходимость помнить о потере this — лишняя когнитивная нагрузка, а бесконечный поток статей про контекст в JS тому подтверждение.