Mobx для управления состоянием в react: основы и примеры использования

Введение в MobX: зачем он нужен и когда выбирать именно его

Основы работы с MobX для управления состоянием - иллюстрация

Если вы разрабатываете интерфейс на React и устали от громоздкой структуры Redux, то MobX может стать приятным открытием. Это библиотека для реактивного управления состоянием, которая позволяет вам писать меньше кода при большей читаемости. В отличие от Flux-подхода, где всё строго, MobX ориентируется на прозрачную реактивность: любые изменения состояния автоматически отражаются в интерфейсе. Для тех, кто только начинает, основы MobX покажутся интуитивными — особенно если вы знакомы с объектно-ориентированным программированием. Но не стоит думать, что MobX — это просто: несмотря на свою простоту на поверхности, он требует понимания реактивной модели данных.

Установка и базовая настройка MobX

Подключаем MobX и MobX-React

Начнем с самого простого — как использовать MobX в вашем проекте. Установите необходимые зависимости:

```
npm install mobx mobx-react-lite
```

Если вы работаете с функциональными компонентами, то используйте `mobx-react-lite`, так как он оптимизирован под React Hooks. После установки можно приступить к созданию первой модели состояния. Например, создадим простой стор (store), который управляет счетчиком. Для этого используем функцию `makeAutoObservable`, которая автоматически делает все свойства наблюдаемыми и все методы — действиями. Это упрощает код и избавляет от необходимости вручную помечать каждое свойство.

Создание первого хранилища состояния

```javascript
import { makeAutoObservable } from "mobx";

class CounterStore {
count = 0;

constructor() {
makeAutoObservable(this);
}

increment() {
this.count += 1;
}

decrement() {
this.count -= 1;
}
}

export const counterStore = new CounterStore();
```

Теперь у нас есть полноценный MobX-стор, к которому можно подключить любой компонент React. Это и есть самый базовый способ начать MobX управление состоянием.

Интеграция MobX с React-компонентами

Оборачиваем компоненты в `observer`

Чтобы React-компонент начал реагировать на изменения в MobX сторах, его нужно обернуть в функцию `observer` из `mobx-react-lite`. Например:

```javascript
import React from "react";
import { observer } from "mobx-react-lite";
import { counterStore } from "./stores/CounterStore";

const Counter = observer(() => {
return (

Счетчик: {counterStore.count}


);
});
```

Теперь, при каждом обновлении `count`, компонент автоматически перерендерится. Это основа MobX — реактивность без лишней возни. В отличие от Redux, вам не нужно явно подписываться на стор или использовать селекторы. Всё работает «из коробки».

Типичные ошибки при работе с MobX

Избегайте мутаций вне экшенов

Хотя MobX позволяет изменять состояние напрямую, лучше придерживаться концепции экшенов. Это помогает отлаживать приложение и сохраняет предсказуемость. Например, не стоит напрямую писать:

```javascript
counterStore.count = 10; // Плохая практика
```

Вместо этого — оберните изменение в метод:

```javascript
setCount(value) {
this.count = value;
}
```

И вызывайте `counterStore.setCount(10)`. Особенно это важно, если вы в будущем захотите использовать более строгую реактивность или ввести middleware.

Не забывайте про `observer`

Одно из самых распространенных упущений у новичков — забыть обернуть компонент в `observer`. В итоге состояние меняется, но компонент не перерендеривается. Если вы не видите реактивности — проверьте, обернули ли вы компонент. Это один из тех моментов, которые делают MobX для начинающих немного коварным.

Нестандартные подходы и советы

Используйте MobX как DI-контейнер

Один из нестандартных способов работы с MobX — использовать его для внедрения зависимостей. Например, вы можете создать несколько стора (например, `UserStore`, `AuthStore`, `UiStore`) и передавать их через контекст или хук. Это позволяет не только разделить логику по модулям, но и упростить тестирование. Такой подход особенно полезен в крупных приложениях, где управление состоянием в React с MobX может быстро выйти из-под контроля без четкой архитектуры.

Смешивайте MobX и локальное состояние

Не обязательно все состояние хранить в MobX. Иногда проще использовать `useState` или `useReducer` внутри компонента, особенно если это временные или UI-специфичные данные. MobX хорошо работает там, где данные нужно шарить между компонентами, но не стоит превращать его в глобальный стор для всего подряд. Это особенно важно понимать, если вы только осваиваете основы MobX и хотите избежать перегруженности.

Немного о производительности

MobX сам по себе довольно производителен. Он оптимизирует ререндеры, отслеживая зависимости на уровне полей. Это значит, что если компонент использует только `count`, то изменение другого поля не вызовет лишнего обновления. Однако, будьте осторожны с computed-свойствами и реакциями (`reaction`, `autorun`) — они могут стать ловушкой, если вы не контролируете зависимости. Всегда проверяйте, не создаете ли вы лишние подписки или не инициируете лишние реакции.

Заключение

MobX — это мощный инструмент, особенно если вы предпочитаете декларативный стиль и хотите меньше шаблонного кода. Для тех, кто ищет простой способ реализовать управление состоянием в React с MobX, он предлагает быстрый старт и масштабируемость. Главное — понимать, как работает реактивность, и не забывать об архитектуре. Не бойтесь экспериментировать: MobX — это не только про сторы, но и про свободу в организации бизнес-логики. Надеюсь, теперь вы лучше понимаете, как использовать MobX и избежать частых ошибок.

Прокрутить вверх