JSXとは?
JavaScript
の構文拡張。
XML
のようなマークアップ形式で記述ができる。
コンポーネントを作成するために利用される。
JSXのサンプル
import React from 'react';
type Props = {
message: string;
}
const SampleComponent: React.FC<Props> = ({ message }) => {
return <h1>{message}</h1>;
}
export default SampleComponent;
JSXによって何がされているのか?
JSXは、ReactElement
を作成する関数です。
ReactElement
とはReact API
を介して、HTML
に変換されるオブジェクトのことです。
イメージ
<MyComponent foo="bar">baz</MyComponent>
↓ ReactElement
を生成するcreateElement
メソッドに変換
React.createElement('MyComponent', { foo: 'bar' }, 'baz');
↓ createElement
によって、ReactElement
オブジェクトが作成
{ type: 'MyComponent', props: { foo: 'bar', children: 'baz' }, key: null, }
JSXの拡張子
JSXの拡張子はJavaScript, TypeScriptによって異なり、それぞれ以下の通りです。
.jsx
(JavaScript)
.tsx
(TypeScript)
JSX構文
React.FC
React.FC
は関数コンポーネントを定義するための型です。
const SampleComponent: React.FC = () => { ... }
型定義
// React.FC
type React.FC<P = {}> = FunctionComponent<P>;
// FunctionComponent
interface FunctionComponent<P = {}> {
(props: P & { children?: ReactNode }, context?: any): ReactElement | null;
propTypes?: WeakValidationMap<P>;
contextTypes?: ValidationMap<any>;
defaultProps?: Partial<P>;
displayName?: string;
}
FunctionComponent
のエイリアスであることがわかります。
props
を受け取り、 ReactElemement | null
を返す関数ということです。
式を埋め込む
JSX
でJavaScript
の値を扱うには、中括弧 {}
を使用します。
const user = 'Taro';
const element = <h1>Hello, {user}!</h1>;
尚、if
などの式以外の構文は埋め込むことができません。
条件による表示制御
JSX
では、if
文などの式が埋め込めないため、&&
、||
、??
といった演算子を使って表示を制御します。
{isLoggedIn && <LogoutButton />}
{user.name || "Anonymous"}
{user.name ?? "Anonymous"}
繰り返し
JSX
でリストや配列の要素を繰り返し表示する場合、アロー関数を用います。
<ul>
{items.map(item => (
<li key={item}>{item}</li>
))}
</ul>
コメントアウト
JSXでコメントを書くには、一般的に{/* */}
を使用します。
{/* コメント */}
<div>Hello, world!</div>
フラグメント
Reactのコンポーネントでは、戻り値として単一の要素しか返すことができません。
div
などで要素をラップすることで解決することができますが、これだと不要な要素が作成されてしまいます
return (
<div>
<ChildA />
<ChildB />
<ChildC />
</div>
)
フラグメント(<>
)を使うと、余分なDOMノードを追加せずに複数の要素をグループ化できます。
return (
<>
<ChildA />
<ChildB />
<ChildC />
</>
)
まとめ
JSXの基本についてまとめてみました。
参考になると嬉しいです。