3

初めて React で遊んでいますが、とても気に入っています。これまでのところ、ボードゲームのGoを(大部分) 実装しましたが、慣用的な React の方法でアプローチする方法がわからないという奇妙なことに遭遇しました。基本的に、モデル (ボード ゲーム) を独自のクラスBoardとして実装しました。play(i,j)コンストラクター、メソッド、およびのみを公開しpassます。すべてのゲーム ロジックを処理し、独自の内部状態を適切に更新します。ビュー/コンポーネントに関連するものへの参照はありません。のインスタンスへの参照を維持するBoardViewという React コンポーネントがありますBoard。というコンポーネントもありますAlertView必要に応じて、ゲームの状態 (不正な動きなど) に関するメッセージを表示します。

Board今ではすべてがうまく機能しており、クラスとそのビューの間の関心の分離が気に入っています。しかし、Boardクラスの変更をビューに伝える方法は珍しく、他の React コードと矛盾しているように感じます。基本的に、私はjQuery のイベント システムを悪用して、のような任意のイベントをトリガーできるようにしています["update", "atari", "suicide"]。このスキームでは、Component には を呼び出す onClick リスナーがありBoard.play、Board インスタンスで 0 から多数のイベントをトリガーします。"update"コンポーネントはイベントをリッスンし、 を呼び出しますthis.setState。これにより強制的に再起動render()され、ゲームを正しく描写する状態にビューが置かれます。は、同じボード インスタンスでとイベントをAlertViewリッスンし、同様に呼び出します"atari""suicide"this.setState、別の をトリガーしますrender()

jQuery イベントを削除する必要がありますか? もしそうなら、これを行う最善の方法は何ですか?

すべてのコードはここから入手でき、ここアプリで遊ぶことができます。

編集:後世のために、この質問はコミット3f600cで行われました。

4

2 に答える 2

2

tungd のコメントは正しい方向を示してくれましたが、より完全な答えを得るために自分の質問に答えることにしました。

モデルで発生するすべてのカスタム イベントを削除することになりました。React ドキュメントからの次のスニペットが特に役立つことがわかりました。

一般的なパターンは、データをレンダリングするだけのステートレス コンポーネントをいくつか作成し、階層内でそれらの上にステートフル コンポーネントを配置して、その状態を props 経由で子に渡すことです。ステートフル コンポーネントはすべての対話ロジックをカプセル化しますが、ステートレス コンポーネントは宣言的な方法でデータのレンダリングを処理します。

モデルで「アタリ」や「自殺」などのイベントを発生させる代わりに、モデルin_atariattempted_suicide. 現在、アプリケーション内の 1 つの「親」コンポーネントのみが状態を持っています。宣言的な小道具を介してすべてのサブコンポーネントをレンダリングします。は、そのメソッドが新しいブール値フラグをチェックして適切なテキストをレンダリングするAlertViewサブコンポーネントの 1 つです。renderメインの親 Component は、コンポーネントの状態を更新する (その後 re- を強制するrender) サブコンポーネントにハンドラーを渡します。

関連するcommitで、親コンポーネントに ContainerView という名前を付けました。

于 2014-01-03T22:21:20.370 に答える