36

David Nolen の基本的な Om チュートリアルを読みましたが、アプリケーションの状態とコンポーネントのローカル状態の違いについてまだ少し混乱しています。カーソルが参照されるとき、それはこれらの一方または両方を参照していますか?

4

1 に答える 1

70

私が理解しているように:

アプリケーション状態は、コンポーネント ツリー内のすべてのコンポーネントがカーソルを介してアクセスできる「グローバル」状態です。これはアプリケーションの状態であり、基本的に Om によってレンダリングされているものです。たとえば、チャット プログラムを作成している場合、アプリケーションの状態には、会話中のユーザーのリストと、送信されたすべてのメッセージなどが含まれます。

コンポーネントのローカル状態は、単一のコンポーネントにローカルな状態であり、このコンポーネントの外では見ることができません。ビルドに {:init-state } を渡すか、IInitState を実装して init-state からマップを返すことによって、またはその両方によって設定されます (この場合、それらは一緒に結合されます)。David Nolen は、ドラッグ アンド ドロップ コンポーネントで現在マウスが押されている場合など、一時的な状態にのみローカル状態を使用し、他のすべての状態をアプリケーション状態にすることを推奨しています。つまり、タブ ウィジェットがある場合、現在選択されているタブは (ローカル状態ではなく) アプリケーション状態に設定する必要がありますが、タブが新しい​​場所にドラッグされている場合、現在の位置とマウスの状態は (一時的に -ドラッグ操作が完了するまで) コンポーネントのローカル状態に格納されます。コアのようなもの。

カーソルはアプリケーションの状態にのみ適用され、ツリーのはるか下にあるコンポーネントが実際にアクセスする必要があるデータのみにアクセスできるようにするためのウィンドウのようなものです。

アプリケーションの状態は常にカーソル (チュートリアルではapp ) を介してアクセスされ、アプリケーションの状態の変更はカーソルを介して行われます - om/update の両方! そしてオム/トランザクション!最初の引数としてカーソルを取ります。アプリケーションの状態アトムをリセットで直接設定することもできます! と swap! を使用しますが、David は、Om のより高度な機能 (変更デルタの通知など) の一部を失うことになるため、これに反対することをお勧めします。

ローカル状態は、IRenderState を介して受け取るか、om/get-state で直接アクセスして受け取ることができます。om/set-state でローカル状態を設定できます! および om/upate-state! です。これら 3 つすべてが、コンポーネント バッキング オブジェクト (チュートリアルのowner ) を取ります。

Om には、共有状態という 3 番目のタイプの状態もあります。共有状態は、{:shared ...} オプションを使用して om/root に渡され、om/get-shared を使用して、そのルートの下にあるツリー内の任意のコンポーネントからアクセスできます。これとアプリケーション状態の違いは、アプリケーション状態はカーソル パスによって絞り込まれることです。つまり、サブ コンポーネントはアプリケーション状態全体にアクセスできない場合がありますが、共有状態は常にアクセス可能です。また、アプリケーションの状態を変更すると、コンポーネントが再レンダリングされますが、共有状態はレンダリングをトリガーしません。

余談ですが、実際には4 番目のタイプもあります。{:opts ...} オプションを使用して、ビルドを通じて追加のデータをコンポーネントに渡すことができます。これは、Om/react ライフサイクルの外に存在するデータです。つまり、コンポーネントからアクセスできる不変データですが、コンポーネントはそれを管理しません。これは、構成データに最も役立つようです。

于 2014-04-07T13:34:33.923 に答える