コース一覧
React設計:useEffectとコンポーネント分割
命令的vs宣言的

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分

命令的vs宣言的

手順を書くか、結果を書くか

2つの書き方を並べて見る

このコースは最初のレッスンから「宣言的 UI」という言葉を使ってきました。最後に、同じ機能を2通りで書いて、違いをはっきりさせます。題材は作品一覧の絞り込みです。ボタンを押すと、公開中の作品だけが残ります。

命令的な書き方

命令的な書き方は、画面をどう変えるかの手順を書きます。JavaScript 入門でやったのはこちらです。

JavaScript

button.addEventListener("click", () => { const items = list.querySelectorAll("li"); items.forEach((item) => { if (item.dataset.published === "false") { item.style.display = "none"; } }); });

やっていることは「非公開の li を探して隠す」です。指示としては正しく、実際に動きます。

命令的な書き方が抱える問題

問題は、画面に出ているものが増えたときに現れます。この一覧の上に「3 件を表示中」という件数の表示があったとします。命令的な書き方では、隠す処理を書いた人が件数の書き換えも自分で足さなければいけません。忘れると、3件と出たまま2件しか並んでいない画面になります。

さらに「もう一度押したら全部に戻す」を足すと、今どちらの状態なのかを自分で覚えておく必要があります。ボタンの文言も自分で書き換えます。画面の要素が増えるほど、直し忘れる場所が増えていくのが命令的な書き方の弱点です。

宣言的な書き方

宣言的な書き方は、手順ではなく今の状態のときに画面がどう見えるかを書きます。

JavaScript (JSX)

const [onlyPublished, setOnlyPublished] = useState(false); const shown = onlyPublished ? works.filter((work) => work.published) : works;

あとは shown から一覧も件数もボタンの文言も作ります。state が変われば、そこから作られるものは全部いっしょに変わります。件数の書き換えを忘れることが、そもそも起こりません。

つまり違いは、次のように言えます。命令的は「差分の当て方」を人が書き、宣言的は「あるべき姿」を人が書いて差分は React が計算します。

つまずきどころ

React のコンポーネントの中で document.querySelector を使って画面を直接いじると、次の再レンダリングでその変更は消えます。React は自分が持っているデータから画面を描き直すので、外から手で加えた変更は知らないからです。React を使いはじめた人が最初にはまるのがここです。画面を変えたくなったら、まず「どの state を変えれば、その画面になるか」を考えます。

演習

命令的に書かれた絞り込みを、宣言的な書き方に直します。

ヒント

表示する配列は onlyPublished ? works.filter(...) : works の形で作れます

件数は表示する配列の length から出します。数字を直接書かないようにします

ボタンの文言も三項演算子で出し分けます

App.jsx
プレビュー

できているか

  • 最初は作品が3件並んでいる
  • 最初の件数表示が 3 件 になっている
  • ボタンを押すと公開中の2件だけになり、文言と件数も変わる
  • もう一度押すと3件の表示に戻る
エディタを読み込んでいます