【React】React ~ JSX ~

◾️はじめに

React の勉強をちょこちょこやっていて、
必ず出てくる「JSX」が無視できない位、重要になってきたので
徐々にメモしていく

目次

【1】JSX
【2】Reactでページを作成するイメージ
 Case1:javascriptの場合
 Case2:JSXの場合
【3】使用上の注意
 1)if文は使えない

【1】JSX

* JSX = JavaScript Syntax Extension = JavaScriptの構文拡張
* HTMLのような見た目でUIを記述できる

【2】Reactでページを作成するイメージ

Case1:javascriptの場合

// [1] h1タグの子要素に'Hello, world!'を追加
const element = _reactJsxRuntime.jsx('h1', {
  children: 'Hello, world!',
})

// [1]で作成した要素を、ID「root」配下にレンダリング
ReactDOM.render(element, document.getElementById('root'));

レンダリング結果

<div id="root">
  <h1>Hello, world!</h1>
</div>

Case2:JSXの場合

// HTMLのように見えるが、裏では上のようなJavaScriptが動いている
// => なので、「JSX(JavaScriptの構文拡張)」と呼ばれている
const element = <h1>Hello, world!</h1>

【3】使用上の注意

1)if文は使えない

* if (isNew) { <div>...</div> } else { <span>...<span> } 的なことはできない
 => 対応策1〜2を参照
* 上に+して、複数要素を返す場合は、FragmentやArrayを使う必要がある
* 条件式が複数の場合、JavaScriptの通常の論理演算子 (&&, ||, !) を使って条件式全体を括弧で囲む

対応策1:三項演算子 (? :)

<DialogActions>
  {/* 三項演算子で条件分岐 */}
  {isForNew ? (
    <Button
      onClick={handleAdd}
      variant="contained"
      disabled={saving}
      startIcon={saving ? <CircularProgress size={18} /> : <SaveIcon />}
    >
      {t("save")}
    </Button>
  ) : (
    // FragmentやArrayで複数の要素を返す
    <React.Fragment>
      <Button
        onClick={handleUpdate}
        variant="contained"
        disabled={saving}
        startIcon={saving ? <CircularProgress size={18} /> : <SaveIcon />}
      >
        {t("save")}
      </Button>
      <Button
        onClick={handleDelete}
        variant="outlined"
        disabled={saving}
        startIcon={saving ? <CircularProgress size={18} /> : <DeleteIcon />}
      >
        {t("delete")}
      </Button>
    </React.Fragment>
  )}
  <Button onClick={onClose} disabled={saving} startIcon={<CancelIcon />}>
    {t("cancel")}
  </Button>
</DialogActions>

対応策2:即時実行関数 (IIFE) / 論理AND演算子 (&&)

<!-- 論理AND演算子の場合は、条件式 && 要素 -->
<DialogActions>
  {/* ★ 新規作成 (isForNew) の場合のみ表示するボタン群 */}
  {isForNew && (
    <Button
      onClick={handleAdd}
      variant="contained"
      disabled={saving}
      startIcon={saving ? <CircularProgress size={18} /> : <SaveIcon />}
    >
      {t("save")}
    </Button>
  )}

  {/* ★ 更新/削除 (isForNewがfalse) の場合のみ表示するボタン群 */}
  {!isForNew && (
    <React.Fragment>
      <Button
        onClick={handleUpdate}
        variant="contained"
        disabled={saving}
        startIcon={saving ? <CircularProgress size={18} /> : <SaveIcon />}
      >
        {t("save")}
      </Button>
      <Button
        onClick={handleDelete}
        variant="outlined"
        disabled={saving}
        startIcon={saving ? <CircularProgress size={18} /> : <DeleteIcon />}
      >
        {t("delete")}
      </Button>
    </React.Fragment>
  )}

  {/* キャンセルボタンは常に表示 */}
  <Button onClick={onClose} disabled={saving} startIcon={<CancelIcon />}>
    {t("cancel")}
  </Button>
</DialogActions>

関連記事

React ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/04/29/000000
React ~ props / state ~
https://dk521123.hatenablog.com/entry/2025/10/24/215404
React Hooks ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2025/10/28/233611
React ~ Material UI / 入門編 ~
https://dk521123.hatenablog.com/entry/2025/10/14/224514
react-i18next ~ 多言語対応 ~
https://dk521123.hatenablog.com/entry/2025/10/13/230306
Vite 〜 入門編 〜
https://dk521123.hatenablog.com/entry/2025/10/08/004137