ReactではJSXというJavaScriptの拡張構文を使ったほうが便利です。
公式ページでもReactとJSXを使うことを推奨しています。
JSXはテンプレート言語ではなく、JavaScriptの機能をすべて備えています。
JSXはReact要素を生成します。そしてReact要素をDOMに変換して利用するという流れになります。
JSXの基本
JSXの最も基本的な書き方です。
nameという変数を宣言し、文字列を代入。
それをH1タグの中に展開。
0 1 2 3 |
const name = 'Sato Taro'; const element = <h1>Hello, {name}</h1>; |
JSXの基本として、有効なJavaScriptの式を中括弧{}で囲みます。
関数を利用したJSX記述
もう少し、関数っぽい記述になると、
まず、functionで姓と名をつなげる関数を作ります。
userという変数を宣言し、その中にfirstNameとLastNameを宣言し、文字列を代入します。
userの中からfirstNameとLastNameを取り出して、function formatName(user)で連結。
それをH1タグに表示させます。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function formatName(user) { return user.firstName + ' ' + user.lastName; } const user = { firstName: 'Taro', lastName: 'Sato' }; const element = ( <h1> Hello, {formatName(user)}! </h1> ); |
const elementの部分では複数行記述のため、();で囲んでいます。
JSXは式
コンパイルされた後、JSXの式はJavaScriptの関数呼び出しに変換されてJavaScriptオブジェクトに評価されます。
JSXはif文やfor文の中で利用、変数に代入、引数として利用、関数から返すなどで利用できます。
0 1 2 3 4 5 6 7 |
function getGreeting(user) { if (user) { return <h1>Hello, {formatName(user)}!</h1>; } return <h1>Hello, Stranger.</h1>; } |
JSXでの属性指定
通常のHTMLと同じように引用符を利用できます。
0 1 2 |
const element = <a href="https://www.example.com"> link </a>; |
属性にJavaScriptを埋め込みたい場合は中括弧を利用します。
0 1 2 |
const element = <img src={user.Url}></img>; |
JXSはキャメルケースを利用
JSXはHTMLよりJavaScriptに近い性質を持っています。ReactのDomはキャメルケースの命名規則を利用します。
classname → className
indexpage → indexPage
Reactでの使い方
Reactライブラリをインポートします。
0 1 2 |
import REact from 'react' |
記述例
0 1 2 3 4 5 6 7 8 9 10 |
const SampleButton =() =>{ return ( <button className {'btn-red'}> Sample </button> ) } export default SampleButton; |
React要素はイミュータブル
Reactの要素はイミュータブルオブジェクトで、オブジェクトを作成した後にその子要素や属性を変更できません。
ミュータブルオブジェクト→オブジェクト作成後に状態を変更できる
イミュターブルオブジェクト→オブジェクト作成後に状態を変更できない
ReactでどのようにUIを変更するかというと、root.render()に変更したい新しい要素を渡します。
下記のHTMLファイルを作成します。
divのidはrootとします。
0 1 2 |
<div id="root"></div> |
root.renderによる変更
0 1 2 3 4 5 6 |
const root = ReactDOM.createRoot( document.getElementById('root') ); const element = <h1>Hello, world</h1>; root.render(element); |
・まずReactDom.creatRootにDom要素を渡す
・elementを定義する
・root.renderにelementを渡す
公式ページの参考例で秒刻みで動く時計があります。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
const root = ReactDOM.createRoot( document.getElementById('root') ); function tick() { const element = ( <div> <h1>Hello, world!</h1> <h2>Time: {new Date().toLocaleTimeString()}.</h2> </div> ); root.render(element); } setInterval(tick, 1000); |
setInterval()でroot.render()を毎秒呼び出しています。が、しかし、Reactのアプリケーションはroot.render()を一度しか呼び出せないそうです。
そのため、state付きのコンポーネントにカプセル化する必要があります。
stateについては以下の公式ページに記載してあります。
https://ja.legacy.reactjs.org/docs/state-and-lifecycle.htm
(参考)
React公式ページ 要素のレンダー
React公式ページ–JSX の導入
React公式ページ stateとライフサイクル