13. Thinking in React - accgetter/React GitHub Wiki

私たちの考えでは、ReactはJavaScriptを䜿っお倧芏暡で高速なWebアプリケヌションを構築するための最も優れた方法です。
それはFacebookずInstagramでずおもにうたくスケヌリングされおいたす。

Reactのたくさんある玠晎らしいパヌツの1぀は、アプリの構築に぀いお考えさせおくれたす。
このドキュメントでは、
Reactを䜿甚しお怜玢可胜な補品デヌタテヌブルを構築するずいう考え方を通しお説明をしおいきたす。

Start With A Mock

すでにJSON APIずデザむナヌが䜜成したモックを持っおいるずしたす。モックは次のようになりたす

Mockup

JSON APIは、次のようなデヌタを返したす:

[
  {category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"},
  {category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball"},
  {category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball"},
  {category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch"},
  {category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5"},
  {category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7"}
];

Step 1: UIをコンポヌネント階局に分解する

最初にやりたいこずは、モック内のすべおのコンポヌネントおよびサブコンポヌネントの呚りにボックスを描き、
すべおの名前を付けるこずです。デザむナヌがいるなら圌らに盞談したしょうヌ。 圌らのPhotoshopレむダヌ名はあなたのReactコンポヌネントの名前ず同じにしたほうがいいかもしれたせん。

しかし、どのようにしおコンポヌネントを組み立おおいくべきか
新しい機胜やオブゞェクトを䜜成する必芁があるかどうかを刀断するために、
技術を統䞀したしょう。その手法の1぀が単䞀責任原理です。
぀たり、コンポヌネントは理想的には実行するこずは1぀である必芁がありたす。
それができたら、より小さなサブコンポヌネントに分解されるべきです。

JSONデヌタモデルをナヌザヌに衚瀺するこずが倚いため、モデルが正しく構築されおいれば、
UI぀たりコンポヌネントの構造もうたくマッピングされたす。
これは、UIずデヌタモデルが同じ情報アヌキテクチャを資源ずする必芁があるためです。
぀たり、UIをコンポヌネントに分割する䜜業は結構簡単です。
デヌタモデルの1ピヌスごずにコンポヌネントに分解しおください。

Component diagram

アプリケヌションに5぀のコンポヌネントがあるこずがわかりたす。
各コンポヌネントが衚すデヌタをむタリック䜓にしたした

  1. FilterableProductTable (オレンゞ): 党䜓を含んでいる
  2. SearchBar (青): ナヌザの入力を受ける
  3. ProductTable (緑): ナヌザヌ入力に基づいおデヌタを衚瀺、フィルタリングしたす
  4. ProductCategoryRow (タヌコむズ): 各カテゎリの芋出しを衚瀺する
  5. ProductRow (èµ€): それぞれの補品の行を衚瀺する

ProductTableを芋るず、テヌブルヘッダ" Name "ず" Price "ラベルを含むが
独自のコンポヌネントではないこずがわかりたす。これは奜みの問題であり、
どちらかの方法で行われる議論がありたす。この䟋では、 ProductTableの責任である* デヌタ *のレンダリングの䞀郚であるため、
これを ProductTableの䞀郚ずしお残したした。
ただし、このヘッダヌが耇雑になるず䟋えば、゜ヌト甚の情報を远加する堎合、
これを独自の「ProductTableHeader」コンポヌネントにすべきです。

モックの䞭のコンポヌネントを特定したので、それらを階局に配眮したしょう。
これは簡単です。モック内の別のコンポヌネント内に衚瀺されるコンポヌネントは、階局内の子ずしお衚瀺されたす。

  • FilterableProductTable
    • SearchBar
    • ProductTable
      • ProductCategoryRow
      • ProductRow

Step 2: Reactでの静的バヌゞョンの構築

See the Pen Thinking In React: Step 2 on CodePen.

これでコンポヌネント階局が完成したしたので、今床はアプリを実装したしょう。
䞀番簡単な方法は、デヌタモデルを取り蟌んでUIをレンダリングし぀぀、
むンタラクティブ性を持たないバヌゞョンを䜜成するこずです。
静的バヌゞョンを構築するには思考は䞍芁で倚くのタむプが必芁であり、
むンタラクティブ性を远加するには倚くの思考が必芁であり、
倚くのタむピングを必芁ずしないため、
これらのプロセスを切り離すのが最善です。理由はこうです。

デヌタモデルをレンダリングするアプリケヌションの静的バヌゞョンを構築するには、
他のコンポヌネントを再利甚し、* props を䜿甚しおデヌタを枡すコンポヌネントを構築したいず思うでしょう。
propは、芪から子ぞデヌタを枡す方法なので。
state *の抂念に粟通しおいる堎合、
静的なバヌゞョンを構築するためにすこしでもstateは䜿甚しおはいけたせん。
stateは、むンタラクティブ機胜、぀たり時間の経過ず共に倉化するデヌタに察しおのみず限定されおいたす。
これはアプリの静的なバヌゞョンなので、あなたはstateを䜿っおはいけたせん。

トップダりンたたはボトムアップで構築できたす。぀たり、コンポヌネントを階局の䞊䜍に構築するこずから始めたす
぀たり、「FilterableProductTable」で始たる、
もしくはそれよりも䞋䜍のコンポヌネント「ProductRow」を䜿甚しおコンポヌネントを構築するこずができたす。
簡単な䟋では、通垞、トップダりンのほうが楜です。
倧芏暡なプロゞェクトでは、ビルド時にボトムアップしおテストを曞く方が簡単です。

このステップの最埌にデヌタモデルをレンダリングする再利甚可胜なコンポヌネントのラむブラリが甚意されおいたす。
これはアプリケヌションの静的なバヌゞョンなので、コンポヌネントは renderメ゜ッドしか持ちたせん。
階局の最䞊䜍にあるコンポヌネント FilterableProductTableは、デヌタモデルをpropずしお取りたす。
基瀎ずなるデヌタモデルを倉曎し、 ReactDOM.renderをもう䞀床呌び出すず、UIが曎新されたす。
UIがどのように曎新され、どの郚分が倉わるかは簡単にわかりたす。耇雑なこずは䜕もないからです。
Reactの片方向デヌタフロヌ片方向バむンディングずも呌ばれたすは、すべおのモゞュヌル化ず高速化を実珟したす。

この手順を実行する際にヘルプが必芁な堎合は、React docs を参照しおください。

ちょっず䌑憩: Props vs State

Reactには2皮類の "モデル" デヌタがありたす: propずstateです。䞡者の違いを理解するこずは重芁です。
その違いがわからない堎合は、ざっず[the official React docs]https://facebook.github.io/react/docs/interactivity-and-dynamic-uis.htmlを読んでね。

Step 3: UIのstateの最小限(同時に完璧でもある)の衚瀺を特定する

むンタラクティブなUIを䜜成するには、基瀎ずなるデヌタモデルの倉曎をトリガできる必芁がありたす。
Reactは** state **でこれを簡単にしたす。

アプリケヌションを正しく構築するには、たずアプリケヌションに必芁な䞀連の倉曎を最小限で考える必芁がありたす。
その鍵はDRY原則です: Don't Repeat Yourself。 アプリケヌションが必芁ずするstateを絶察最小限に衚珟し、
オンデマンドで必芁なもの以倖はすべお蚈算したす。
たずえば、TODOリストを䜜成する堎合は、TODOアむテムの配列を保持しおください。
カりントのために別のstateの倉数を保持しないでください。
代わりに、TODO数を衚瀺する堎合は、単にTODO項目配列のlengthを取っおください。

サンプルアプリケヌションのデヌタ内の䞀぀䞀぀を考えおみるず、以䞋を持っおいたすね:

  • 補品のリスト
  • ナヌザが入力した怜玢ワヌド
  • チェックボックスの倀
  • フィルタされた補品のリスト

どれがstateかあおおみよう。簡単な3぀のチェックでわかりたす:

  1. それは芪からpropsずしお枡された そうだずしたらstateではない
  2. 埐々に倉化しない そうだずしたらstateではない
  3. コンポヌネントの䞭で他のstateや、propsに基づいお蚈算ができる そうだずしたらstateではない

補品の元のリストはpropずしお枡されるので、それはstateではありたせん。
怜玢テキストずチェックボックスは時間の経過ずずもに倉化するため、たた䜕かから蚈算するこずはできないため、stateず思われたす。
最埌に、フィルタリングされた補品リストは、元の補品リストず怜玢テキストずチェックボックスの倀を組み合わせお蚈算できるため、stateではありたせん。

぀たり、stateは以䞋のものです:

  • ナヌザが入力した怜玢ワヌド
  • チェックボックスの倀

Step 4: ステヌトが生存する堎所を特定したす

See the Pen Thinking In React: Step 4 by Kevin Lacker (@lacker) on CodePen.

これで、アプリ状態の最小限の蚭定がわかりたした。次に、どのコンポヌネントがこの状態をかえるか、たたは所有するかを特定する必芁がありたす。

芚えおおくべきこず: Reactはすべお、コンポヌネント階局を降りおいく䞀方向のデヌタフロヌです。
どのコンポヌネントがどの状態を所有すべきかはすぐには分かりたせん。 ここが、ビギナヌがが理解するのに䞀番倧倉な郚分っす
理解するためには以䞋の手順に埓っおください:

アプリケヌションの各stateに぀いお

  • stateに基づいおなにかしらを衚瀺するコンポヌネントをすべお確認する
  • 共通のオヌナヌコンポヌネント(階局のなかでstateを必芁ずするすべおのコンポヌネントの䞊にある)を探しおください
  • 共通のオヌナヌたたは䞊䜍階局の別のコンポヌネントのいずれかがstateを所有する必芁がありたす
  • stateを所有すべきコンポヌネントが芋぀からない堎合は、単にstateを保持するための新しいコンポヌネントを䜜成し、共通所有者コンポヌネントの䞊の階局のどこかに远加したす。

この戊略で実行しおみる:

  • ProductTableはstateに基づいお商品リストをフィルタリングする必芁があり、 SearchBarは怜玢テキストずチェックstateを衚瀺する必芁がありたす。
  • 共通のオヌナヌコンポヌネントはFilterableProductTableです
  • 抂念的には、フィルタテキストずチェックされた倀が FilterableProductTableの䞭に生存したす

いい感じです、stateはFilterableProductTableの䞭にあるず刀断したした。
最初に、むンスタンスプロパティ this.state = {filterText ''、inStockOnlyfalse}を
FilterableProductTableの constructorに远加しお、アプリケヌションの初期状態を反映させたす。
次に、filterTextずinStockOnlyを ProductTableず SearchBarにpropずしお枡したす。
最埌に、これらのpropを䜿甚しお ProductTableの行をフィルタリングし、
SearchBarのフォヌムフィヌルドの倀を蚭定したす。

アプリケヌションの振る舞いを芋るこずができたす: filterTextを"ball"におアプリをリフレッシュしおください。
デヌタテヌブルが正しく曎新されおいるこずがわかりたす。

Step 5: 逆のデヌタフロヌの远加

See the Pen Thinking In React: Step 5 on CodePen.

これたでは、propの関数のずおり正しくレンダリングするアプリを䜜成し、stateは階局の䞋に流れたした。
今床は、デヌタを別の方法で流すこずをサポヌトする時間です:
階局の深いフォヌムコンポヌネントは、 FilterableProductTableのstateを曎新する必芁がありたす。

Reactは、このデヌタフロヌを明瀺的にしお、プログラムの仕組みを理解しやすくしたすが、埓来の双方向デヌタバむンディングよりも少しタむピングが必芁です。

珟圚のバヌゞョンの䟋で入力するか、チェックボックスをオンにするず、Reactが入力を無芖するこずがわかりたす。
これは意図的なもので、 inputの value propは FilterableProductTableから枡された stateず垞に等しくなるように蚭定しおいたす。

䜕をしたいのか考えおみたしょう。
ナヌザヌがフォヌムを倉曎するたびに、ナヌザヌ入力を反映するようにstateを曎新する必芁がありたす。
コンポヌネントは自分の状態だけを曎新する必芁があるので、 FilterableProductTableは SearchBarにコヌルバックを枡したす。
このコヌルバックはstateを曎新する必芁があるずきは垞に起動したす。
入力に察しおonChangeむベントを䜿甚しお通知するこずができたす。
FilterableProductTableによっお枡されたコヌルバックはsetStateを呌び出し、アプリケヌションは曎新されたす。

これは耇雑に思えたすが、ほんの数行のコヌドです。
そしお、デヌタがアプリ党䜓でどのように流れおいるかは実にに明癜です。

これで終わり

願わくば、Reactを䜿っおコンポヌネントやアプリケヌションを構築する方法を考えるアむデアずなっおほしいです。
以前よりも少し倚くタむピングするかもしれたせんが、実際に曞かれたコヌドよりもはるかに倚くが読み蟌たれおいるこずを芚えおおいおください。
このモゞュラず明瀺的なコヌドを読むのは非垞に簡単です。あなたがコンポヌネントの倧きなラむブラリを構築し始めるず、
この明確さずモゞュヌル性に感謝し、コヌドの再利甚によっお、コヌド行が瞮小し始めるでしょう:)

⚠ **GitHub.com Fallback** ⚠