Open6

読書メモ りあクト!②React基礎編

ksk nksk n

5-1 なぜReactではJSXを使うのか

5-1-1 JSXはどのように変換されるか

JSXとは

  • JSXとはJavaScriptの中にXMLライクな記述が出来るようにした構文拡張
    • 構文拡張 = 言語標準には含まれない特殊な用途のための便利な構文を後づけで使えるようにしたもの

コンパイル前後比較

コンパイル前

<button type="submit" autoFocus>
Click Here!
</button>

コンパイル後

import { jsx as _jsx } from 'react/jsx-runtime';
_jsx('button', {
  type: 'submit',
  autoFocus: true,
  children: 'Click Here',
});
  • XML のノードツリーを React.createElement というメソッドのコールに変換

XMLのノードツリー

https://memopad.bitter.jp/w3c/dom/dom_nodetree.html

  • そうすると以下の様なオブジェクトが生成される
{
  type: 'button',
  props: {
    type: 'submit',
    autoFocus: true,
    children: 'Click Here',
  },
  key: null,
};
  • これは TypeScript では ReactElement というインターフェースを下敷きにしたオブジェクトになる。
  • つまり React において JSX の構文は、本質的には React.createElement(...) のシンタックスシュガーであ
    り、ReactElement オブジェクトを生成する特殊な式だと言える」

JSXはあくあで最終的にJavascriptに解釈されるものであり、Javascriptの枠組みを超えるような言語ではない

Hidden comment
ksk nksk n

5-1-3 なぜReactはテンプレートを使わないのか

  • Vueとかはhtmlテンプレートを使う

HTMLテンプレートとは

HTMLのテンプレートに対して、動的な値を埋め込む方法のこと
https://itpfdoc.hitachi.co.jp/manuals/3020/30203D6240/USR20456.HTM#:~:text=HTMLテンプレートとは,Web,効率良く作成できます。

テンプレートエンジンとは

HTMLテンプレートを実現してくれるエンジン?
https://www.codegrid.net/articles/template-engine-1/#toc-2

  • ReactはViewのレンダリングもJavascriptの中で行う
    • テンプレートを使わない理由は以下の2つの言葉に集約されるらしい
      • テンプレートは技術は分離するが関心は分離しない
      • 表示ロジックとマークアップは否応なしに結びつく
    • Webアプリケーションを組版指定(画面表示?)ではなく、制御構造が主体だと捉えているらしい

テンプレートエンジンの呪い(とコンポーネントのメリット)

  • htmlテンプレートに記載するために、フレームワーク独自の制御構文とかが増える
  • コンポーネントをテンプレートとロジックで分けて書くと再分割しづらくなる
  • テンプレートはフレームワークによるコンパイルをはさむため、エラーが非常に分かりづらくなる
    • Reactは素直はJSのエラー
  • テンプレートは静的解析が難しい
    • 関数だと静的解析と相性が良い

所管

  • React早く書いてみたい
  • 著者のReact推しがすごい
  • 昔ロジックが複雑なページをVueで泣きそうになりながら作った事を思い出した
ksk nksk n

5-1-4 JSXは汎用的にUIを表現する

  • ハイパーテキストを表現するHTMLではなく、汎用的なXMLがベースになっている
  • Reactはレンダラー(仮想DOMをViewに反映させるやつ)を本体から分離する設計になっており、それを入れ替えて様々なプラットフォームのアプリケーションやドキュメントを表現するという意図がある
    • React Nativeもその一つ
    • pdf用のレンダラーを使えばpdfが出力される

所管

タイトル通り。知らんことばかりで驚き。

ksk nksk n

5-2 JSX構文の書き方

5-2-1 JSXの基本的な文法

  • 関数でJSXで記述したテンプレートを戻り値にする
    • 戻り値の型はReact.FunctionComponentをインターフェースに
  • {}を使ってJS・TSの式をテンプレート内に埋め込める
    • これを利用して、ショートサーキット評価を活用し表示・非表示の出し分け等の制御をかける
  • 複数の要素が含まれる時にトップレベルの要素がひとつである必要がある
    • <>(フラグメント)をトップレベルにもってくる事で複数要素を無駄なくレンダリング出来る

所管

  • JSX自体はそんなにトリッキーなものはないと思った
ksk nksk n

5-2-2 JSXとコンポーネントの関係

  • コンポーネントは引数を受け取る事が可能
    • 文字列等はもちろん、子要素も

所管

  • 覚える事はあるがそこまで違和感なし