Mobx + React: Краткое руководство

Mobx - это глобальное хранилище состояний, которое часто используется в качестве замены Redux из-за его менее крутой кривой обучения. Это связано с тем, что он использует объектно-ориентированный подход к управлению состоянием (по сравнению с функциональным для Redux) и имеет меньше шаблонов. Это руководство предназначено для демонстрации абсолютного минимума для начала работы с Mobx. Более подробную информацию можно найти в документации Mobx.

Установите Mobx и mobx-react

Для начала нам нужно установить Mobx и mobx-react

npm install mobx --save
npm install mobx-react --save

Добавить поддержку декоратора

Mobx использует множество функций высшего порядка для украшения функций и свойств класса. В результате Mobx проще использовать с новым синтаксисом декоратора ES2016. К сожалению, по умолчанию Babel не выполняет транспиляцию декораторов, поэтому нужен плагин.

Установите плагин

npm install --save-dev babel-plugin-transform-decorators-legacy

Затем добавьте его в свой .babelrc

{
    "plugins": ["transform-decorators-legacy"]
}

Создание государственного магазина

В Mobx состояние хранится в обычном классе со свойствами, которые хранят состояние, и функциями, которые манипулируют или раскрывают это состояние. Например, хранилище состояний Mobx для приложения Todo может выглядеть так:

import { observable, computed, action } from "mobx";
class TaskStore {
   @observable tasks = [];
   @action.bound 
   addTask(item) {
     this.tasks.push(item)
   }
   @computed get totalTasks() {
     return this.tasks.length;
   }
}

Декораторы делают магазин Mobx реактивным при изменении состояния.

Как показано выше, для магазина Mobx есть 3 основных декоратора.

@observable

Украшает свойства и позволяет отслеживать изменения состояния свойства.

@action

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

@computed

Украшает функции, возвращающие значения, рассчитанные из внутреннего состояния.

Подключиться к магазину

Для начала нам нужно сделать наш магазин доступным для всех компонентов.

import { Provider } from "mobx-react";
import {TableStore} from './TableStore'
const App = () => (
    <Provider todoStore={new TodoStore()}>
        <TodoDisplay />
    </Provider>
)

Теперь любой компонент может подключиться к магазину вот так

import {observer, inject} from 'mobx-react';
@inject('todoStore') @observer
const TodoDisplay = (props) => {
    const onClick = () => {props.todoStore.addTask('Do chores')}
    return(
      <div>
        <div>Number of tasks {props.todoStore.totalTasks}</div>
        {  props.todoStore.tasks.map((item) => 
            (<div>{item}</div>)
          )
        }
      ...      
     </div> 
   );
}

Вот и все! Теперь вы можете использовать Mobx.