Document for ReactMeetup#2 at 20150908
React Componentのコンストラクタを追いかけて2015/09/08 React Meetup #2hosomichi
View Slide
自己紹介と申します
自己紹介所属・Reactを活用した開発業務(5ヶ月少々)・インターネット広告タグの開発・その他何でも(バックエンド/インフラ/Android/マネジメント)を生業としております
私めの課題感
React初学者への作法説明がゆるい私めの課題感
私めの課題感例えばのようなコード
いわゆるJSコンストラクタと異なる構文に対して、役割理解・整理が仕切れておらず上手に説明ができていない自分がいるなーと私めの課題感
という課題を解決すべく、ソースコード(0.13.3)を追うことでReactの裏側の理解を深めつつ整理しました
①コンストラクタ生成
①コンストラクタ生成・内部的にReactClass.createClassをコール・引数オブジェクトは内部的にはspecと名付け・Constructorという名のコンストラクタ関数を返却spec
①コンストラクタ生成・ES6型のクラス定義もコンストラクタ関数を提供・上記の場合はHosoComponentという コンストラクタ関数になりますね
①コンストラクタ生成最終的に↑のようなコンストラクタ関数が出来上がります※便宜上Componentコンストラクタ、 実体をComponentインスタンスと呼びますConstructorprototypespec
①コンストラクタ生成注)specはprototypeに納められます。specのメンバは全てのComponentインスタンスでアクセス可能・共有されます。Constructorprototypespecprototype
②ReactElement生成
②ReactElement生成・内部的にはReactElement.createElementをコール・Componentコンストラクタ・propsを受け取り ReactElementインスタンスを返すJSXと関数コール(やっていることは同じ)
②ReactElement生成・生成されたReactElementは↑のような感じです・第一引数に指定したComponentコンストラクタは typeというメンバに納められますReactElementインスタンスtypekeypropsref
ところで、まだコンストラクタは実行されていませんよね・・・どこでコンストラクトしてるのか・・・わくわく♪
③React.render
③React.render・引数にReactElementとコンテナ要素を受け取って 画面描画を実行・戻り値としてComponentコンストラクタの 結果値であるインスタンスを返す
③React.renderrender工程の道のりは長いのですが・・・ReactMountReactUpdateReactReconcilerReactCompositeComponent
③React.renderReactCompositeComponent.mountComponentにてインスタンスを生成していました
③React.renderここでReactElementに渡したpropsが引数となりインスタンスごとの固有データもここで入ります
④最後にthisについてこのthisはComponentインスタンスそのものということでした
まとめます
①createClassはComponentコンストラクタを生成②ReactElementはコンストラクタとprops/key/refを紐付けたデータ構造③ComponentインスタンスはReact.render中に生成される④renderメソッドなどの内部のthisはComponentインスタンスそのもの①④②③
最後に一句詠みます