モチベーション
互換性とシンプルさの理由から、外部のグローバルステートではなく、Reactの組み込みステート管理機能を使用するのが最善です。しかし、Reactには特定の制限があります
- コンポーネントステートは、共通の祖先に押し上げることでしか共有できませんが、これにはレンダリングし直す必要がある巨大なツリーが含まれる可能性があります
- コンテキストは、それぞれのコンシューマーを持つ値の無制限のセットではなく、単一値のみを格納できます
- これらの両方により、APIとセマンティクスと動作の両方をできる限りReactらしく保ちながら、ツリーの上部にあるコードを(ステートが格納される場所)とツリーの下部にあるコード(ステートが使用される場所)に分けることが困難になります
これを改善したいと考えていますが、同時に、APIとセマンティクスと動作をできる限りReactらしく保ちます
Recoilは、あなたのReactツリーとは直交しつつも本質的および付随的に定義された有向グラフを定義します。ステートの変化は、このグラフのルート(アトムと呼ばれる)から、純粋関数(セレクタと呼ばれる)を介して、コンポーネントに流れます。このアプローチにより、
- 共有ステートがReactローカルステートと同じ単純な取得/設定インターフェースを持つ、定型句のないAPIが得られます(必要に応じて、リデューサなどでカプセル化できます)。
- 同時モードや、利用可能になった他の新しいReact機能と互換性を持つ可能性があります
- ステートの定義は段階的で分散しているため、コード分割が可能になります
- コンポーネントを変更することなく使用されるデータの状態を派生データと入れ替えることができます。
- 使用されるコンポーネントを変更することなく、派生データは同期と非同期の切り替えを行えます。
- ナビゲーションをファーストクラスの概念として扱い、リンクの状態遷移をエンコードすることもできます。
- 下位互換性のある方法で、アプリケーション状態全体を永続化しやすいため、永続化された状態はアプリケーションの変更に耐えることができます。