コース一覧
React設計:useEffectとコンポーネント分割
つくる - ヘッダー時計

React設計:useEffectとコンポーネント分割

副作用、useEffect、依存配列、クリーンアップ、stateの持ち上げ、propsの受け渡し、1コンポーネント1責務、部品ツリーとフォルダ構成を扱う全19レッスンの設計コースです。JavaScript版プロフィールサイトを、状態と責務が整理されたReactアプリとして完成させます。

1
useEffectのきほん
01. 副作用とは10分
02. useEffect15分
03. 依存配列15分
04. タイトル連動15分
05. 時計とクリーンアップ15分
06. つくる - ヘッダー時計20分
07. 第7章クイズ15分
2
コンポーネント分割の設計
01. 部品ツリーで考える10分
02. stateを持ち上げる15分
03. propsのバケツリレー15分
04. 1部品1責務15分
05. フォルダ構成10分
06. つくる - ツリー整理20分
07. 第8章クイズ15分
3
総合制作
01. 全セクションReact化20分
02. メモウィジェットReact版20分
03. 命令的vs宣言的10分
04. 自由拡張20分
05. 完成と次のステップ10分

つくる - ヘッダー時計

この回で作るもの

プロフィールサイトのヘッダーに、いまの時刻を出しつづける時計を置きます。JavaScript 入門で innerHTML を書きかえて作ったものを、React の書き方でやり直します。

第7章で学んだ3つをそのまま使います。副作用は useEffect に置くこと、依存配列で走るタイミングを決めること、始めたタイマーはクリーンアップ関数で止めることです。

state に入れるのは時刻そのもの

時計の state は「表示用の文字列」ではなく Date のオブジェクトにします。

JavaScript (JSX)

const [now, setNow] = useState(new Date());

こうしておくと、時刻から何を作るか (時分秒だけ、日付つき、挨拶の文言) を描画側で自由に決められます。state には元のデータを持ち、見せ方は描画で作る のが基本の形です。

2桁に揃える

getMinutes() は 5 分なら 5 を返します。そのままだと表示が揃わないので、padStart で 2 桁にします。

JavaScript (JSX)

const hh = String(now.getHours()).padStart(2, "0"); const mm = String(now.getMinutes()).padStart(2, "0"); const ss = String(now.getSeconds()).padStart(2, "0"); const clock = `${hh}時${mm}分${ss}秒`;

ヘッダーを部品にする

時計はヘッダーの中身なので、Header.jsx に切り出して App.jsx から使います。useState と useEffect は使う部品の中に書きます。時計の state を App が持つ必要はありません。

JavaScript (JSX)

import Header from "./Header.jsx";

つまずきどころ

タイマーが動いているかは、時刻の表示だけでは分かりにくいものです。今回は確認用に更新回数も出します。数が増えていれば、setInterval が生きている証拠です。

演習

ヘッダーに常駐する時計を完成させます。

ヒント

1つの setInterval の中で setNow と setTicks の両方を呼んで構いません

2桁に揃えるには String(now.getHours()).padStart(2, "0") を使います

App.jsx
Header.jsx
プレビュー

できているか

  • h1 が header の中に入っている
  • 時計に「時」が表示されている
  • 時計に「秒」が表示されている
  • 1秒ごとに更新され、2 秒後に「更新 2 回」になっている
エディタを読み込んでいます