Reactを勉強していたら急に「JSX」って言葉が出てきたんだよね・・・
英語だし、難しく感じるよ・・・
JSXっていう言葉だけを見ると難しく感じるよね。
でも意味と使い方が分かると難しくないから解説していくね!
JSXとは?
JSXはXMLのような記述をできるようにした構文拡張です。
「JSX」は「JavaScript」と「XML」を組み合わせた言葉です。
ReactはJSのライブラリのためHTMLを直接記述できません。
そのため内容を記述するときは構文拡張であるJSXを使います。
構文拡張とは特殊な用途に使うための便利な構文を、後から追加で使えるようにしたものです。
JSXの例
JSXで記述した例をもとに解説するね!
以下の構文は文字列でもHTMLでもありません。JSXで記述したものです。
const name = 'React';
const element = (
<h1 className="sample-class">
Hello, {name}!
</h1>
);
JavaScriptの変数にHTML要素が代入されているので少し違和感があるかもしれませんが、これがJSXになります。
JSXは拡張構文なので以下のように変換され、コンパイルされます。
const element = React.createElement(
'h1',
{className: 'sample-class'},
'Hello, React!'
);
コンパイル時の構文を見るとJSXを使わなくても記述できるのではと思う方がいるかもしれません。
実はReactはJSXを使うことは必須ではありません。
しかしコードを見て分かるように、React.createElement
を使って書くのは手間がかかり煩雑になってしまいます。
JSXを使ったほうがHTMLのような記述ができるためシンプルで可読性がよいコードを書くことができます。
JSXで記述すると役立つエラーや警告もより多く表示できるため、JSXをおすすめします。
JSXはReactで使う特殊な構文だよ!
そしてJSXで記述することをおすすめするよ!
JSXについて分かったよ!
ReactではJSXを使ったほうが便利なんだね!
JSXの記述方法
JSXの記述について解説していくね!
式を埋め込む
式を埋め込むときは中括弧({}
)を使います。
const name = 'React';
const element = (<h1>Hello, {name}!</h1>);
以下のように関数を使うこともできます。
function helloName(name) {
return 'Hello, ' + name + '!';
}
const name = 'React';
const element = (
<h1>
{helloName(name)}
</h1>
);
式なので{1 + 1}
などを埋め込むこともできます。
JSXは式となる
JSXはコンパイルした後、JavaScriptの関数呼び出しに変換されます。
これはJavaScriptオブジェクトであると言えます。
そのためJSX はif文やfor文の中で使うことができ、変数への代入、引数としての受け取りができます。
また関数から返すことも可能です。
function helloName(name) {
if (name.length) {
return <h1>{helloName(user)</h1>;
} else {
return <h1>Hello, Anonymous.</h1>;
}
}
属性を埋め込む
属性を指定するときは引用符(""
or ''
)を使うことができます。
const element = <a href="https://choippo.com/">choippo</a>;
属性に式を埋め込むときは中括弧を使います。
const url = 'https://choippo.com/';
const element = <a href={url}>choippo</a>;
const url = 'https://choippo.com/';
const element = <a href="{url}">choippo</a>;
属性の命名規則
JSXはJavaScriptに則した命名規則となります。
JSXの属性はHTMLの属性では指定できません。キャメルケースを使用します。
HTML | JSX |
---|---|
class | className |
for | htmlFor |
フラグメント
フラグメントとは子要素をまとめるものだよ。
JSXでは親要素を1つにしないといけません。
const element = (
<div>
<h1>Hello, React!</h1>
</div>
);
親要素を複数にしてしまうとエラーになってしまいます。
const element = (
<div>
<h1>Hello, React!</h1>
</div>
<div>
<h1>Hello, JSX!</h1>
</div>
);
複数の場合も親要素が必要です。
しかし、不要な親要素を記述しないとけないこともあります。
そのときは、React.Fragment
を使うことで空の要素を作ることができます。
const element = (
<React.Fragment>
<div>
<h1>Hello, React!</h1>
</div>
<div>
<h1>Hello, JSX!</h1>
</div>
</React.Fragment>
);
毎回React.Fragment
を記述するのは少し煩雑なので省略することができます。
子要素をまとめるときは省略した<>
と</>
のタグを使うことが多いです。
const element = (
<>
<div>
<h1>Hello, React!</h1>
</div>
<div>
<h1>Hello, JSX!</h1>
</div>
</>
);
終了タグがないタグのとき
終了タグがないときは最後に/
を入れて閉じます。
inputタグやimgタグ、brタグなどには注意しましょう。
const element = (
<div>
<input type="text" />
</div>
);
コメントアウト
コメントは/* */
と//
を使うことで記述できます。
const element = (
<div>
{/* 1行でコメント */}
{/*
複数行でコメント1
複数行でコメント2
*/}
{// コメント(最後の閉じ中括弧は改行すること)
}
</div>
);
まとめ
少し特殊な構文だけどJSXについて解説したよ!
- JSXはXMLのような記述ができるようにした構文拡張
- ReactでJSXを使うことは必須ではないが、JSXを使ったほうが簡潔に記述することができる
- 式を埋め込むときは中括弧(
{}
)を使う - 属性はキャメルケースになる
- 親要素は1つにしなければいけない
- 終了タグがないタグには最後に
/
を付ける - コメントアウトを入れることもできる
JSXという言葉を見たとき難しいものだと思ったけど、
内容が分かったら便利なものだと分かったよ!