コース一覧
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分

タイトル連動

state を外の世界に反映する

useEffect の使いどころで分かりやすいのが、state とブラウザの状態を合わせる仕事です。今回はいいね数をブラウザのタブのタイトルに出します。

タブのタイトルは document.title に文字列を入れると変わります。React が管理していない場所なので、これは副作用です。

JavaScript (JSX)

useEffect(() => { document.title = `いいね ${likes} 件`; }, [likes]);

依存配列に likes を入れているのがポイントです。これで「いいね数が変わったときだけタイトルを書き直す」になります。押すたびに state が変わり、描画のあとに effect が走り、タイトルが追いかけます。

なぜイベントハンドラーではないのか

「ボタンを押したときにタイトルを変える」と考えると、onClick の中に書きたくなります。それでも一応動きますが、いいね数を変える経路が増えたとき (取り消しボタン、初期値の読み込みなど) にそのたびタイトルの更新を書き足すことになります。

effect にしておくと、経路が何本になっても「likes が変わったらタイトルを合わせる」1か所で済みます。きっかけの操作ではなく、合わせたい結果を書く のが React の考え方です。

表示を目で確かめる

タブのタイトルは小さくて見落としやすいので、この演習では同じ文字列を画面にも出します。effect の中で document.title を書きかえるのと同時に、state にも同じ文字列を入れます。

JavaScript (JSX)

const text = `いいね ${likes} 件`; document.title = text; setTitlePreview(text);

つまずきどころ

依存配列を [] にすると、タイトルは最初の 0 件のまま止まります。押しているのにタイトルが変わらないときは、まず依存配列を見てください。

演習

いいね数をタブのタイトルと画面の両方に反映します。

ヒント

文字列はテンプレートリテラルで組み立てると読みやすいです

先に const text = ... で1つ作り、document.title と setTitlePreview の両方に使いまわします

App.jsx
プレビュー

できているか

  • 最初の表示でタイトルが「いいね 0 件」になっている
  • タイトルにサイト名が入っている
  • いいねを押すとタイトルが 1 件に追いかけて変わる
エディタを読み込んでいます