Reactive State

MobX

MobX ist reaktives State Management: Annotieren Sie Ihre Daten, und alles, was davon abhängt, aktualisiert sich automatisch. Keine Selektoren, keine Reducer, nur Observables.

intermediate13 min readUpdated 15. Sept. 2026
store.js
js
// store.js
import { makeAutoObservable } from "mobx";

class CounterStore {
  count = 0;

  constructor() {
    makeAutoObservable(this);
  }

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

  get double() {
    return this.count * 2;
  }
}

export const counter = new CounterStore();
Modell
Transparente Reaktivität
State
Observables
Abgeleitet
Computed Values
Updates
Actions
React
observer HOC
Boilerplate
Sehr gering

Warum es wichtig ist

Warum sich MobX automatisch anfühlt

Automatisches Tracking

Sie müssen keine Subscriptions manuell verdrahten. MobX registriert, was jede Komponente liest, und aktualisiert sie, sobald sich diese Daten ändern.

Abgeleitete Werte bleiben aktuell

Computed Values werden nur dann neu berechnet, wenn sich ihre Abhängigkeiten ändern, und werden dazwischen zwischengespeichert.

Feingranulare Updates

Nur die Komponenten, die tatsächlich ein geändertes Observable lesen, rendern neu, was große Apps performant hält.

Das Gesamtbild

Die drei Kernideen hinter MobX

Observable State, daraus abgeleitete Computed Values und Actions, die diesen ändern. Reactions verbinden all das mit der UI.

Observables

State

Einfache Daten, die als observable markiert sind, damit MobX jeden Lese- und Schreibzugriff tracken kann.

Computed

Ableiten

Aus Observables berechnete Werte, die automatisch gecached und bei Bedarf invalidiert werden.

Actions und observer

Update & Render

Actions ändern den State, und observer-Komponenten abonnieren automatisch alles, was sie lesen.

MobX auf einen Blick

Der Kern von MobX

makeObservable

Annotieren Sie Felder, Getter und Methoden, um Observables, Computed Values und Actions zu definieren.

makeAutoObservable

Leitet die Annotationen für eine Klasse automatisch ab, was den Großteil des Boilerplates eliminiert.

computed

Cached einen abgeleiteten Wert und berechnet ihn nur neu, wenn sich die Abhängigkeiten ändern.

action

Markiert Funktionen, die den State ändern, damit Updates gebündelt (batched) und nachverfolgbar sind.

observer

Wrappt eine React-Komponente, sodass sie neu rendert, wenn sich die gelesenen Observables ändern.

reactions

Führt Side Effects als Reaktion auf State-Änderungen aus, außerhalb des Render-Trees.

Eine kurze Geschichte

Reaktiver State im Wandel der Zeit

  1. 2015

    MobX Release

    Michel Weststrate führt transparenten reaktiven State in die JavaScript-Welt ein.

    15
  2. 2016

    MobX 2 und 3

    Bessere Observability und Performance machen es populär bei React-Entwicklern.

    16
  3. 2018

    MobX 4 und 5

    Proxies ersetzen Property Descriptors, und Class Decorators werden optional.

    18
  4. 2020

    MobX 6

    makeAutoObservable und der Verzicht auf Decorators vereinfachen die moderne API.

    20
  5. Heute

    Eine reife reaktive Option

    Eine stabile Wahl für Teams, die automatisches Dependency Tracking gegenüber expliziten Selektoren bevorzugen.

    Heute

Der vollständige Leitfaden

MobX: Alles was Sie wissen müssen

Was ist MobX?

MobX ist eine Library für reaktives State Management. Du markierst deine Daten als observable, und MobX verfolgt alles, was diese Daten liest. Wenn sich die Daten ändern, aktualisieren sich die Werte und Komponenten, die davon abhängen, automatisch. Es müssen keine Selektoren geschrieben und keine Subscriptions verwaltet werden.

Die Philosophie ist fast das Gegenteil von Redux. Während Redux jede Änderung durch Actions und Reducer explizit und nachvollziehbar macht, gestaltet MobX Änderungen durch automatische Dependency-Verfolgung implizit. Du schreibst ganz normalen objektorientierten Code, und die Reaktivität passiert im Hintergrund.

Observables und makeAutoObservable

Der einfachste Weg, einen Store zu erstellen, ist eine Klasse, die mit makeAutoObservable annotiert ist. Dadurch wird automatisch abgeleitet, was ein Observable, ein computed value oder eine Action sein soll.

// store.js
import { makeAutoObservable } from "mobx";

class TodoStore {
  todos = [];

  constructor() {
    makeAutoObservable(this);
  }

  add(text) {
    this.todos.push({ id: Date.now(), text, done: false });
  }

  toggle(id) {
    const todo = this.todos.find((t) => t.id === id);
    if (todo) todo.done = !todo.done;
  }

  get remaining() {
    return this.todos.filter((t) => !t.done).length;
  }
}

export const todoStore = new TodoStore();

makeAutoObservable behandelt Felder als Observables, Getter als computed values und Methoden als Actions. Du schreibst ganz normales JavaScript — this.todos.push(...) — und MobX trackt es.

Computed Values

Ein Computed Value leitet Daten aus Observables ab. Er wird zwischengespeichert und berechnet sich nur dann neu, wenn sich eine seiner Abhängigkeiten ändert.

// cart.js
class Cart {
  items = [];

  constructor() {
    makeAutoObservable(this);
  }

  get total() {
    return this.items.reduce((sum, item) => sum + item.price, 0);
  }

  get isEmpty() {
    return this.items.length === 0;
  }
}

Da total berechnet wird, kostet das Auslesen an hundert verschiedenen Stellen nur eine einzige Berechnung. Zudem bleibt es konsistent: Ändern Sie den Preis eines Artikels, und jeder Leser sieht die neue Gesamtsumme, ohne dass eine manuelle Invalidierung erforderlich ist.

Actions

Actions sind die Funktionen, die den State ändern. Wenn man sie explizit als solche kennzeichnet, kann MobX Updates bündeln (Batching) und Änderungen nachvollziehbar machen.

// actions.js
import { action, makeObservable, observable } from "mobx";

class Settings {
  theme = "dark";
  fontSize = 16;

  constructor() {
    makeObservable(this, {
      theme: observable,
      fontSize: observable,
      update: action,
    });
  }

  update({ theme, fontSize }) {
    if (theme) this.theme = theme;
    if (fontSize) this.fontSize = fontSize;
  }
}

Mit makeAutoObservable passiert dies automatisch. Der Vorteil von Actions ist das Batching: Mehrere Änderungen innerhalb einer Action lösen eine einzige Reaction aus, anstatt einer pro Zuweisung. MobX kann zudem erzwingen, dass der State nur innerhalb von Actions geändert wird, wodurch versehentliche Mutationen abgefangen werden.

Verbindung zu React mit observer

Die Higher-Order Component observer abonniert für eine React-Komponente diejenigen Observables, die sie während des Renderings liest.

// TodoList.jsx
import { observer } from "mobx-react-lite";
import { todoStore } from "./store";

export const TodoList = observer(() => {
  return (
    <div>
      <p>{todoStore.remaining} remaining</p>
      <ul>
        {todoStore.todos.map((todo) => (
          <li key={todo.id} onClick={() => todoStore.toggle(todo.id)}>
            {todo.done ? "✓" : "○"} {todo.text}
          </li>
        ))}
      </ul>
      <button onClick={() => todoStore.add("New task")}>Add</button>
    </div>
  );
});

Die Komponente muss ihre Abhängigkeiten niemals explizit auflisten. MobX zeichnet diese während des Render-Vorgangs auf und löst ein Re-Render aus, sobald sich eine dieser Abhängigkeiten ändert. Nur Komponenten, die ein geändertes Observable tatsächlich lesen, werden aktualisiert, was von Grund auf eine feingranulare Steuerung ermöglicht.

Reactions und asynchroner State

Eine Reaction führt einen Side Effect aus, wenn sich beobachtete Daten außerhalb des Render-Trees ändern. Nutze sie für Logging, Persistenz oder die Synchronisierung mit externen Systemen.

// persist.js
import { autorun } from "mobx";

autorun(() => {
  localStorage.setItem("theme", settings.theme);
});

Asynchrone Actions folgen demselben Muster wie jede andere Klassenmethode. MobX liefert sogar flow für generator-basierte asynchrone Flows mit, aber eine einfache async-Methode mit runInAction für das finale State-Update funktioniert ebenfalls gut.

// users.js
import { makeAutoObservable, runInAction } from "mobx";

class UserStore {
  users = [];
  loading = false;

  constructor() {
    makeAutoObservable(this);
  }

  async fetchUsers() {
    this.loading = true;
    const res = await fetch("/api/users");
    const users = await res.json();
    runInAction(() => {
      this.users = users;
      this.loading = false;
    });
  }
}

MobX im Vergleich

MobX, Redux und Zustand verwalten alle den State, aber die mentalen Modelle unterscheiden sich.

  • MobX trackt Abhängigkeiten automatisch. Du schreibst Code, der wie mutable Daten aussieht, und erhältst dafür kostenlose, feingranulare Updates.
  • Redux macht Änderungen durch Actions und Reducer explizit, was eine strikte Struktur und mächtige Devtools bietet.
  • Zustand liegt dazwischen: ein winziger Store mit expliziten Selectors und fast ohne Ceremony.

Wenn du objektorientierte Stores magst und es nicht gerne bist, Selectors zu schreiben, ist MobX ein Vergnügen. Wenn du explizite, funktionale Updates und einen einzigen immutable Tree bevorzugst, ist Redux die bessere Wahl. Wenn du etwas Kleines und Vorhersehbares suchst, schau dir Zustand an.

Best Practices

  • Verwende makeAutoObservable für Stores und observer für Komponenten.
  • Nutze computed Getter für abgeleitete Daten, anstatt Berechnungen zu duplizieren.
  • Markiere Zustandsänderungen als Actions, damit Updates gebündelt werden und nachvollziehbar bleiben.
  • Halte Stores als einfache Klassen und vermeide es, nicht-observable UI-Zustände darin zu speichern.
  • Verwende runInAction für Zustandsaktualisierungen nach einem await.
  • Speichere Serverdaten in einer Data-Fetching-Library anstatt in einem MobX Store.
  • Lies Observables nicht außerhalb einer Reaction oder eines Observers aus, wenn du Updates erwartest.

Häufige Fehler

  • observer vergessen und sich wundern, warum die Komponente nicht aktualisiert wird.
  • Ein Observable nur einmal auslesen und den Wert cachen, wodurch die Reaktivität verloren geht.
  • Große Nicht-Observable-Objekte speichern und dadurch Änderungen übersehen.
  • State außerhalb einer Action mutieren, wenn der Strict Mode aktiviert ist.
  • Übermäßiger Einsatz von Reactions für Dinge, die eigentlich über computed values gelöst werden sollten.
  • MobX als Cache für Server-State verwenden.

Wie geht es weiter?

MobX ist ein ausgereifter, automatisierter Ansatz für reaktiven State. Vergleiche ihn mit dem expliziten Modell von Redux Toolkit und dem Minimalismus von Zustand und lagere Server-Daten zu TanStack Query aus. Erstelle anschließend einen kleinen Store und erlebe selbst, wie wenig Konfigurationsaufwand nötig ist, um die UI synchron zu halten.

Komponenten-State

Mit observer rendert eine Komponente neu, wenn sich die gelesenen Observables ändern – ganz ohne Selektoren oder Hooks.

MobX
import { observer } from "mobx-react-lite";
import { counter } from "./store";

export const Display = observer(() => (
  <p>{counter.count}</p>
));
useState
const [count, setCount] = useState(0);
// plus effects and props
// to keep it in sync

Abgeleitete Werte

computed cached das Ergebnis und berechnet es nur neu, wenn eine Abhängigkeit geändert wird.

Bevorzugt
class Cart {
  items = [];
  constructor() {
    makeAutoObservable(this);
  }
  get total() {
    return this.items.reduce(
      (sum, i) => sum + i.price, 0,
    );
  }
}
Vermeiden
// recomputed on every access
// and duplicated in each
// component that needs it

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, MobX zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch MobX — mit Quizzen und echtem Code, den Sie im Browser ausführen können.