ReactのJSX構文まとめ

JSXとはJavaScript XMLの略であり、Reactのコンポーネント内でマークアップ言語を記述するためのXML風の構文です。
Reactを初めて触れた時になかなか慣れなくて「JSXって難しい!!」ってイメージがあったので基本構文を簡潔にまとめてみました。

HTML要素の書き方

HTML要素が1行の場合はreturnの後に記述。

const Component = () => {
  return <div>Hello React !</div>
}

HTML要素が複数行になる場合はreturnの中を「( )括弧」で囲みます。

const Component = () => {
  return (
    <div className="row">
      <div className="col-12">
        <div>1</div>
        <div>2</div>
        <div>3</div>
      </div>
    </div>
  )
}

JSXでは単一のルートを持つというルールがあるので、下記のような書き方はJSXの構文ではエラーとなります。

// NGパターン
const Component = () => {
  return (
    <div>1</div>
    <div>2</div>
    <div>3</div>
  )
}

// OKパターン
const Component = () => {
  return (
    <div>
      <div>1</div>
      <div>2</div>
      <div>3</div>
    </div>
  )
}

ReactにはFragment要素というものが準備されており、これを使うことで不必要な<div>タグで囲むことを回避できます。
JSXの中では<React.Fragment>要素としてみなされますが、実際にHTMLを出力する際にはこの要素は出力されません。

const Component = () => {
  return (
    <React.Fragment>
      <div>1</div>
      <div>2</div>
      <div>3</div>
    </React.Fragment>
  )
}

Fragmentには下記のシンタックスシュガー(別記法)も用意されていますので、このように省略して記述することも出来ます。
こちらの書き方のスッキリしますね。

const Component = () => {
  return (
    <>
      <div>1</div>
      <div>2</div>
      <div>3</div>
    </>
  )
}

クラス名(CSS Style)の指定

クラス名の指定はclassName=""

<div className="headerLabel">

コメントアウト

対象の1行のみをコメントアウトする方法 {// code… /}

const Component = () => {
  return (
    <div>
      <div className="col-12">
        {// 
        <input value="hoge"></input>
        }

        NGパターン1
        {// <input value="hoge"></input> } ← NG(エラーになります)

        NGパターン2
        {// <input value="hoge"></input> 
            <input value="fuga"></input> 
        } ← NG(エラーになります)
      </div>
    </div>
  ) 
}

「NGパターン1」の注意点は、上記のNG箇所のように1行で挟めようとするとコンパイルエラーになるのでかならず閉めの「}」の前には改行を入れましょう。
「NGパターン2」の注意点は複数行をコメントアウトしようとするとエラーになるので、複数行をコメントアウトする場合には次の「複数行をコメントアウトする方法」を使いましょう

複数行をコメントアウトする方法 {/* code… */}

const Component = () => {
  return (
    <div>
      <div className="col-12">
        {/* 
        <input value="hoge"></input>
        */}

        {/* <input value="hoge"></input> */}

        {/* 
        <input value="hoge"></input>
        <input value="fuga"></input>
        */}
      </div>
    </div>
  ) 
}

変数の埋め込み

JXSで変数を埋め込むにはHTML要素の中で変数を「{ }」で囲みます。

const userName = "Yamada";

const Component = () => {
  return (
  <>
    <div>Hello {userName}.</div>
  </>
  )
}

関数の埋め込み

関数を埋め込む場合も変数と同様に「{ }」で囲みます。

type User = {
  lastName: string;
  firstName: string;
}

const getFullName = (user: User) => {
  return user.lastName + " " + user.firstName;
}

const Component = (user: User) => {
  return (
  <>
    <div>Hello {getFullName(user)}.</div>
  </>
  )
}

イベントハンドラ(onClick等)


const countUp = () => {
  count += 1;
}

const Component = () => {
  return (
  <>
    <div>{counter}</div>
    <button onClick={countUp}>One</button>
  </>
  )
}

イベントハンドラに引数を渡して実行する場合はアロー関数を使います


const add= (addCount : number) => {
  count += number;
}

const Component = () => {
  return (
  <>
    <div>{counter}</div>
    <button onClick={() => add(100)}>One</button>
  </>
  )
}

ちなみに下記の書き方はNG


const add= (addCount : number) => {
  count += number;
}

const Component = () => {
  return (
  <>
    <div>{counter}</div>
    <button onClick={add(100)}>One</button>
  </>
  )
}

条件分岐

三項演算子

プログラミング言語でおなじみの三項演算子が使えます

const Component = ({myFlag}) => {
  return (
  <>
    <div>This is {myFlag ? 'OK' : 'NG'}</div>
  </>
  )
}

JSX条件式

JSXの特殊な分岐判定の記載方法で「左辺 && 右辺」という書き方をします。
左辺は判定内容、右辺は「左辺がtrue」となる時に描画する内容を記載します。

const Component = ({myFlag}) => {
  return (
  <>
    <div>This is {myFlag && 'OK'}</div>
  <div>This is {myFlag && <h2>OK</h2>}</div>
  </>
  )
}

即時関数

即時関数書式を使うことでif文等の条件式を書くことが出来ます。

const Component = ({myFlag}) => {
  return (
  <>
    {(() => {
        if (myFlag) {
          return <p>OK</p>
        } else {
          return <p>NG</p>
        }
      })()}
  </>
  )
}

ループ(map)処理

JSX内でリストを元にループ処理を行う場合はmapを使います。
また、配列をmapで一覧表示する際にはHTMLタグの要素(attribute)にユニーク要素となるkeyを指定する必要があります。

{/* 基本構文 */}
{/* 
mapの第一引数:配列要素のオブジェクト
mapの第二引数:配列要素のインデックス
 */}
{array.map((引数1, 引数2) => {
  return <p key={引数2}>{引数1}</p>
})}

ループ処理例

const monthList = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"];

const Component1 = () => {
  return (
  <>
    <ul>
      {monthList.map((month, i) => {
        return <li key={i}>{month}</li>
      })}
    </ul>
  </>
  )
}

{/* returnを省略して記述することも可 */}
const Component2 = () => {
  return (
  <>
    <ul>
      {monthList.map((month, i) => <li key={i}>{month}</li>)}
    </ul>
  </>
  )
}

Leave a Reply

Your email address will not be published. Required fields are marked *