【React基礎 #1】 環境構築とJSXについて
ReactはUIを作るためのJavaScript用のライブラリです。
コンポーネント指向で、アプリケーションを開発する上で状態の管理もしやすく、拡張性があります。
今回は環境構築とReactの特徴の1つであるJSXについて書きます。
環境構築
create-react-appのインストール
yarn add --dev create-react-app
Node.jsとyarnをインストールした後、create-react-appのインストールをします。
create-react-appをインストールすることで、Reactの開発で必要なbabelやwebpackといったものをマニュアルでインストールしなくても簡単に環境構築ができます。
アプリケーションの作成
yarn create-react-app app-name
create-react-appコマンドでアプリケーションの作成をします。
「app-name」のところは任意なアプリ名を記述します。
コマンドを実行するとアプリ名のディレクトリが作成されます。
アプリケーションの立ち上げ
yarn start
作成されたアプリのディレクトに移動してコマンドを実行すると、サーバが立ち上がりlocalhost:3000でブラウザに表示されます。
JSXについて
ReactではJSXというJavaScriptの拡張言語が使えます。
JSXとは「JavaScriptXML」の略で、JavaScript内でHTMLを簡単に記述することができるようになります。
実際にブラウザに表示するには、JSXのままではブラウザが認識をしないので、JavaScriptにトランスパイルされます。
JSXの利点
下記のコードはどちらもHello, world!と表示します。
JSXでの記述例
import React from 'react';
const App = () => {
return (
<div>Hello, world!</div>;
);
}
export default App;
JSXを用いない記述例
import React from 'react';
const App = () => {
return (
React.createElement(
'div',
'null',
'Hello, world!'
)
);
}
export default App;
どちらも同じ結果を返しますが、JSXを用いることでJavaScript内でHTMLを簡単に記述することができます。
DOMに出力されるものが直感的になり可読性も良くなります。
JSXの基礎文法
それではJSXの基礎文法を見ていきます。
Reactパッケージをimportする
import React from 'react';
パッケージはJSXファイルの先頭でimportします。
{ }内でJavaScriptの記述ができる
import React from 'react';
const App = () => {
const name = 'Taro';
return (
<div>I'm {name}</div>
);
}
export default App;
// I'm Taro
JSXの{ }内ではJavaScriptが記述できます。
HTML属性の記述方法
JSXではJavaScriptの予約語と被ってしまうHTMLの属性は、通常のHTMLとは別の記述方法になります。
【class属性】
import React from 'react';
const App = () => {
const name = 'Taro';
return (
<div className="my-name">I'm {name}</div>
);
}
export default App;
// <div class="my-name">I'm Taro</div>
class属性はclassNameになります。
【for属性】
import React from 'react';
const App = () => {
return (
<label htmlFor="email">
メールアドレス:<input id="email" />
</label>
);
}
export default App;
labelで使うfor属性はhtmlForになります。
属性名はキャメルケース
import React from 'react';
const App = () => {
return (
<div>
<button className="click-button" onClick={() => console.log('Clicked!')}>CLICK</button>
</div>
);
}
export default App;
HTML属性のclassNameやhtmlFor同様、onClickやonChangeなどの属性名も全てキャメルケースで記述します。
空要素は閉じる
import React from 'react';
const App = () => {
return (
<label htmlFor="email">
メールアドレス:<input id="email" type="email" value="" />
</label>
);
}
export default App;
HTML5では省略できますが、JSX内ではinputタグやimgタグなどの空要素は閉じる必要があります。
1つの要素しかreturnできない
import React from 'react';
const App = () => {
return (
<div>
<label htmlFor="name">
名前:<input id="name" type="text" value="" />
</label>
<label htmlFor="email">
メールアドレス:<input id="email" type="email" value="" />
</label>
</div>
);
}
export default App;
JSXでは1つの要素しかreturnできないので、複数の要素をreturnする場合は1つの要素にまとめます。
【エラー例】
import React from 'react';
const App = () => {
return (
<label htmlFor="name">
名前:<input id="name" type="text" value="" />
</label>
<label htmlFor="email">
メールアドレス:<input id="email" type="email" value="" />
</label>
);
}
export default App;
// Adjacent JSX elements must be wrapped ...
複数の要素をreturnしているのでエラーになります。
React.Fragmentについて
Reactでは複数の要素をreturnできない制約があるので、本来必要のないタグを記述しなければいけない場合があります。
それを避けるためにReact.Fragmentを使うことで、不必要なタグがない状態で展開することができます。
import React from 'react';
const App = () => {
return (
<React.Fragment>
<label htmlFor="name">
名前:<input id="name" type="text" value="" />
</label>
<label htmlFor="email">
メールアドレス:<input id="email" type="email" value="" />
</label>
</React.Fragment>
);
}
export default App;
// <label htmlFor="name">
// 名前:<input id="name" type="text" value="" />
// </label>
// <label htmlFor="email">
// メールアドレス:<input id="email" type="email" value="" />
// </label>
<React.Fragment>
はDOMには出力されません。
またReact.Fragmentにはシンタックスシュガーがあり、<>
で記述することもできます。
import React from 'react';
const App = () => {
return (
<>
<label htmlFor="name">
名前:<input id="name" type="text" value="" />
</label>
<label htmlFor="email">
メールアドレス:<input id="email" type="email" value="" />
</label>
</>
);
}
export default App;
まとめ
- create-react-appをインストールすることで簡単に開発環境が作れる。
- JSXはJavaScriptの拡張言語で、JavaScript内でHTMLを記述することができる。
- returnできる要素は1つだけ。
- JSXで不要なタグを記述しないといけない場合は、「React.Fragment」を使う。
さいごに
以上、Reactの環境構築とJSXについてでした。
JSXがあることによって可読性が良く、VueのようにHTMLテンプレートに条件分岐などを記述しなくても良いので、コードが複雑になってもリファクタリングもしやすそうです。