React Hooks + TypeScriptによるUseEffect(Cleanup)の使い方
はじめに
React Hooks + TypeScriptによる基礎学習の UseEffect(Cleanup) のアウトプットになります。
タイマー、カウント、リセットなどの機能を実装する。
前回学習したReact Hooks + TypeScriptによるUseEffect(条件付き)の続きからになります。
学習に使用した教材・参考資料
ゴール
以下のようにカウントが実行され、ボタンを押すとリセットされ、再度ボタンを押すとカウントが開始される仕組みを作る。
学習手順
ファイル構造
# react-sample-app -> react-ts-app -> src
src
├── App.css
├── App.test.tsx
├── App.tsx
├── components
│ ├── Hello1.tsx
│ ├── Hello2.tsx
│ ├── BasicUseEffect.tsx
│ ├── Timer.tsx <-- 作成
│ └── TimerContainer.tsx <-- 作成
├── index.css
├── index.tsx
├── logo.svg
├── react-app-env.d.ts
├── reportWebVitals.ts
└── setupTests.ts
1. componentsフォルダにTimerContainer.tsxとTimer.tsxを作る
まずは、TimerContainer.tsxとTimer.tsxをcomponentsフォルダに新規作成して、以下のようにテンプレートにするコードを記述する。
vscodeだと[rafce]と入力すると補完機能が効いて以下のコードを補完してくれる。
# TimerContainer.tsx
import React from 'react'
const TimerContainer = () => {
return (
<div>
</div>
)
}
export default TimerContainer
# Timer.tsx
import React from 'react'
const Timer = () => {
return (
<div>
</div>
)
}
export default Timer
2. 機能を実装する
機能が実行される流れは、App.tsx -> TimerContainer.tsx -> Timer.tsx の流れで機能が実行される。
App.tsx
App.tsxにTimerContainer をインポートする。
# App.tsx
import React from 'react';
import logo from './logo.svg';
import './App.css';
// import Basic2 from './components/Hello2';
// import BasicUseEffect from './components/BasicUseEffect'; //<-- コメントアウト
import TimerContainer from './components/TimerContainer'; //<-- インポート
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
{/* <Hello2 /> */}
{/* <BasicUseEffect /> */} //<-- コメントアウト
<TimerContainer /> //<-- 埋め込む
</header>
</div>
);
}
export default App;
TimerContainer.tsx
タイマーを実装するので、機能としてはボタンを押すとタイマーがリセット又は再起動するようにする。
{ display && <Timer /> } は論理積でタイマーのボタンの切り替えをする。
<Timer />は基本的にはTrueであり、displayがボタンを押すことでTrue/Falseの切り替えをする、それにより、カウントが始まったり、リセットされたりする。Timer.tsxのuseEffect()にて機能が実行される。
# TimerContainer.tsx
import React, {useState} from 'react'
import Timer from './Timer' //<-- インポートする
const TimerContainer = () => {
const [display, setDisplay] = useState(true)
return (
<div>
<button onClick={()=>setDisplay(!display)}>Switch Timer</button>
{ display && <Timer /> }
</div>
)
}
export default TimerContainer
Timer.tsx
タイマーを作る。
まず、[useState]と[useEffect]をインポートする
useState関数に[count]と[setCount]を実装する、そして初期値は[0]にする。
time関数を作成し、これが呼び出された時に[1]追加される仕組みを作る。
useEffect関数を実装する、タイマーを呼び出すのは最初の1回だけにするので、第二引数に[]を入れておく、それからカウントが1秒に一回呼び出されてtime関数を実行するようになるので[time, 1000]とする。
タイマーを削除リセットする為に、clearInterval(interval) を記入し、実行を確認する為のconsole.log("cleared")を記述する。
ボタンの下に現在のカウントの値を表示させる為に{count}を実装。
# Timer.tsx
import React, {useState, useEffect} from 'react' //<-- インポートする
const Timer = () => {
const [count, setCount] = useState(0)
const time = () => { // <-- time関数1秒に1回実行される
setCount(prevCount => prevCount+1)
}
useEffect(() => {
const interval = setInterval(time, 1000) // <-- time関数を1秒づつ呼び出している
return () => { // <-- 論理積によりdisplayがFalseになると実行される
clearInterval(interval)
console.log("cleared")
}
}, [])
return (
<div>
{count}
</div>
)
}
export default Timer
3. 動作確認
localhost:3000に接続し以下のように表示され、タイマーがカウントされて、ボタンを押すとコンソールに[cleared]と表示動作が確認できれば問題なし。
再び、ボタンを押すとカウントが始まる。
おわりに
useEffect(Cleanup)の学習でした。
次回はAPIデータ取得(axios + fetch)です。