見出し画像

Reactの基礎〜elementの表示〜

HTMLタグを値として直接記述できるようにするもので「文法拡張」という。

JSXの更新とイベント

必要に応じて更新する方法

表示を一定間隔でrenderして更新する
setIntervalで一定間隔で処理(関数)を実行する。

// 1秒間隔で処理を実行
setInterval(() => { 処理 }, 1000);

第一引数:アロー関数で実行する処理を用意
第二引数:1000ms(1秒)ごとに処理が実行されるようにする

JSXは変数代入時にコンパイルされる

1秒ごとにカウントされる表示

let dom = document.querySelector('#root')
let title = "React page."
let message = "Display a message."
var counter = 0
setInterval(() => {
   counter++
   let el = (
       <div>
           <h4>{title}</h4>
           <h6>{message}</h6>
           <h5 className="alert alert-primary">
               count: {counter}.
           </h5>
       </div>
   )
   ReactDOM.render(el, dom)
}, 1000)


`el`を`setInterval`から出してしまうとカウントされなくなる。

let el = (
       <div>
           <h4>{title}</h4>
           <h6>{message}</h6>
           <h5 className="alert alert-primary">
               count: {counter}.
           </h5>
       </div>
   )
setInterval(() => {
   counter++
   ReactDOM.render(el, dom)
}, 1000)


理由 -> 変数`el`が`count: 0`のあと更新されないから(JSX内で使った変数は自動的に更新されるわけではない)
※`state`を使えば「自動更新」することもできる

クリックして更新する

アロー関数を作り、その中で、変数`counter`を増やし、変数`el`にJSXの値を代入し直し`ReactDOM.render`でレンダリングする。

let doAction = (event) => {
   counter++
   let el = (
       <div>
           <h4>{title}</h4>
           <h6>{message}</h6>
           <h5 className="alert alert-primary"
               onClick={doAction}>
               count: {counter}.
           </h5>
       </div>
   )
   ReactDOM.render(el, dom)
};


関数を呼び出すのを忘れないようにすること

フォームの値を利用する

入力フィールドとプシュボタンを用意
- `input`タグは閉じた具がないので必ず最後は`/>`とすること

<div className="form-group">
   <label>Input:</label>
   <input type="text" className="form-control" id="input" onChange={doChange} />
</div>
<button onClick={doAction}
   className="btn btn-primary">
   Click
</button>


HTML要素のイベント属性に関数を設定した場合、引数に`event`というオブジェクトが渡される。
`event`には`target`というプロパティがあって、ここにイベントが発生した要素のオブジェクトが保管されている。

let doChange = (event) => {
   in_val = event.target.value
   message = 'Hello, ' + in_val + '!!'
}

.