MobX: введение
В Части E ты собрал Task Tracker на чистом React + TypeScript. Теперь перепишем то же приложение на MobX и почувствуем разницу подходов. Функциональность не меняется — меняется способ управления состоянием.
Зачем переписывать
Заголовок раздела «Зачем переписывать»React-хуки управляют состоянием «вручную»: ты сам вызываешь setState, сам перечисляешь зависимости в useMemo/useEffect, сам решаешь, что мемоизировать. MobX переворачивает подход: состояние — это наблюдаемые объекты, а компоненты автоматически подписываются на то, что читают, и перерисовываются при изменении. Никаких массивов зависимостей и setState.
| Аспект | React-хуки (Часть E) | MobX (Часть F) |
|---|---|---|
| Состояние | useState / useReducer | класс с makeAutoObservable |
| Изменение | setTasks(prev => ...) | прямое присваивание в action |
| Производное | useMemo вручную | computed-геттер автоматически |
| Подписка | сам компонент рендерится | observer подписывается на чтения |
| Зависимости | массив deps вручную | отслеживаются автоматически |
Что меняется концептуально
Заголовок раздела «Что меняется концептуально»-
Состояние переезжает в класс-стор. Вместо
useStateв компоненте — поля классаTaskStore, помеченные как наблюдаемые черезmakeAutoObservable. -
Мутации разрешены — но через actions. В MobX ты пишешь
this.tasks.push(task)прямо (не нужен spread), но только внутри метода-действия. -
Производное состояние — это
computed-геттеры. Фильтры и счётчики становятсяget-свойствами; они кэшируются и пересчитываются автоматически при изменении зависимостей — аналогuseMemo, но без массива зависимостей. -
Компоненты оборачиваются в
observer. Он подписывает компонент на наблюдаемые, которые тот читает, и перерисовывает при их изменении.
Установка
Заголовок раздела «Установка»npm install mobx mobx-react-litemobx— само ядро (observable, computed, action, reaction).mobx-react-lite— лёгкая интеграция с React для функциональных компонентов (observer,useLocalObservable). Именно lite-версия рекомендуется для функциональных компонентов.
Маршрут Части F
Заголовок раздела «Маршрут Части F»- Шаг 1 —
TaskStore(makeAutoObservable, actions): поля и операции добавления/удаления/переключения. Эквивалент шага E1 (useState). - Шаг 2 —
computed+observer: фильтры, счётчики и реактивные компоненты. Эквивалент шага E2 (useMemo). - Шаг 3 — async +
RootStore: загрузка изtaskApi(черезrunInActionиflow),RootStore+ Context, персист черезautorun. Эквивалент шагов E3 (useEffect), E5 (Context) и E6 (персист).
Поехали — Шаг 1: TaskStore.