TL;DR
JavaScript の状態管理ライブラリ。「アプリケーションの状態から導けるものは、すべて自動で導くべきだ」という考え方にもとづく。
なぜ必要か
状態はふつうの JavaScript の代入で更新でき、変更は依存しているところへ自動で伝わる。実行時に値の読み書きを追跡するので、React のコンポーネントは依存する値が変わったときだけ再描画される。手でメモ化したりセレクタを書いたりしなくてよい。UI フレームワークに縛られないので、状態のコードを切り離してテストしやすい。
仕組み
データの流れは一方向である。クリックやタイマーなどのイベントがアクションを呼び、アクションが observable な状態を更新し、その変更が状態に依存するすべてのもの(computed な値や、コンポーネントなどの副作用)に伝わる。
例
makeAutoObservable で状態とアクションを定義し、observer で包んだコンポーネントから使う。
import { makeAutoObservable } from "mobx"
import { observer } from "mobx-react-lite"
const myTimer = makeAutoObservable({
secondsPassed: 0,
increase() {
this.secondsPassed += 1
},
reset() {
this.secondsPassed = 0
},
})
const TimerView = observer(({ timer }) => (
<button onClick={() => timer.reset()}>Seconds passed: {timer.secondsPassed}</button>
))TimerView は timer.secondsPassed に依存していることが検出され、この値が変わったときだけ再描画される。