6日目のゴールとテーマ
6日目のテーマは「ブラウザ上で動く“名簿アプリ”の最初の形を作る」です。
4日目で学んだ「オブジェクト+配列」、5日目で学んだ「HTMLとJavaScriptの連携」を組み合わせて、
今日は「人を登録して、画面に一覧表示する」というところまで持っていきます。
ポイントは三つです。
画面は「ただの入れ物」で、データの本体は JavaScript 側に持つこと。
配列を「アプリの状態(state)」として扱うこと。
配列の中身をもとに「画面を描き直す」という考え方を身につけること。
ここが分かると、もう立派に「アプリを作る人の頭」になっていきます。
今日作るミニアプリのイメージ
機能のイメージを先に言葉で決める
まずは、どんな動きをするアプリにするかを言葉で決めます。
「名前と年齢を入力して『追加』ボタンを押すと、下に名簿として追加されていく」
これだけです。シンプルですが、アプリの基本が全部入っています。
ユーザーが入力する。
JavaScriptがオブジェクトを作って配列に入れる。
配列の中身をもとに、画面の一覧を描き直す。
この流れを、今日は丁寧にコードに落としていきます。
HTMLの土台を用意する
入力欄とボタンと「一覧表示エリア」
テキストエディタで index.html を開き、次のような内容にします。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>6日目:名簿ミニアプリ</title>
</head>
<body>
<h1>名簿ミニアプリ</h1>
<div>
<input type="text" id="name-input" placeholder="名前">
<input type="text" id="age-input" placeholder="年齢">
<button id="add-button">追加</button>
</div>
<h2>登録された人一覧</h2>
<div id="list-area">
まだ誰も登録されていません。
</div>
<script src="main.js"></script>
</body>
</html>
HTMLここで押さえておきたいのは三つです。
名前と年齢の入力欄に、それぞれ id を付けていること。
「追加」ボタンにも id を付けていること。
一覧を表示する場所として、id="list-area" の div を用意していること。
JavaScript は、この id を手がかりに HTML 要素をつかまえて操作していきます。
JavaScript側の「状態」として配列を持つ
people 配列をアプリの“心臓”にする
main.js を作り、まずは次のように書きます。
let people = [];
let nameInputElement = document.getElementById("name-input");
let ageInputElement = document.getElementById("age-input");
let addButtonElement = document.getElementById("add-button");
let listAreaElement = document.getElementById("list-area");
JavaScriptここでやっていることをかみ砕きます。
people という空の配列を用意しています。ここに「1人分のオブジェクト」をどんどん入れていきます。
その下で、HTML 側の入力欄、ボタン、一覧表示エリアを、それぞれ変数としてつかんでいます。
大事なのは、「データの本体は people 配列にある」という意識です。
画面はあくまで「people の中身を見せているだけ」です。
一覧を描く関数 renderList を作る
「配列の中身から画面を作る」専用の関数
次に、「今の people 配列の中身をもとに、list-area の中身を全部描き直す」関数を作ります。
function renderList() {
if (people.length === 0) {
listAreaElement.textContent = "まだ誰も登録されていません。";
return;
}
let lines = [];
for (let i = 0; i < people.length; i = i + 1) {
let person = people[i];
let line = (i + 1) + "人目: 名前: " + person.name + " / 年齢: " + person.age + "歳";
lines.push(line);
}
let text = lines.join("\n");
listAreaElement.textContent = text;
}
JavaScriptここでの重要ポイントを丁寧に見ていきます。
最初に「誰もいないとき」の特別処理をしていること。
people.length が 0 のときは、メッセージを出して return で関数を終わらせています。
次に、lines という配列を用意していること。
これは「画面に表示する1行1行の文字列」を一時的にためておく配列です。
for ループの中で、i 番目の person を取り出し、
「何人目か」「名前」「年齢」を1つの文字列 line にまとめて、lines に push しています。
最後に、lines.join(“\n”) で、配列の中身を改行でつないで1つの長い文字列にしています。
それを listAreaElement.textContent に入れることで、一覧として表示しています。
ここで大事なのは、「画面を直接ちょこちょこいじる」のではなく、
「配列 → 文字列 → 一括で表示」という流れにしていることです。
この「render(描画)関数」を1つ持っておくと、
データが変わったときに「とりあえず renderList を呼べば画面が最新になる」という状態を作れます。
「追加」ボタンが押されたときの処理を書く
入力値からオブジェクトを作り、配列に入れて、描画する
次に、「追加」ボタンにイベントを登録します。
addButtonElement.addEventListener("click", function () {
let name = nameInputElement.value;
let ageText = ageInputElement.value;
if (name === "") {
alert("名前を入力してください。");
return;
}
let age = Number(ageText);
if (Number.isNaN(age) || age < 0) {
alert("年齢は0以上の数字で入力してください。");
return;
}
let person = {
name: name,
age: age
};
people.push(person);
nameInputElement.value = "";
ageInputElement.value = "";
renderList();
});
JavaScriptここでの重要ポイントを深掘りします。
まず、入力欄から値を取り出しています。
nameInputElement.value で名前、ageInputElement.value で年齢の文字列を取得しています。
次に、入力チェックをしています。
名前が空文字なら alert を出して return で処理を中断しています。
年齢は Number に変換し、NaN だったりマイナスだったりしたら、同じく alert して return しています。
そのあとで、person オブジェクトを作っています。
name と age をプロパティに持つ、1人分の情報の塊です。
people.push(person) で、その人を配列に追加しています。
これで「アプリの状態」が1件増えました。
入力欄を空文字に戻して、ユーザーが次の入力をしやすいようにしています。
最後に renderList() を呼んでいます。
これがとても大事で、「配列が変わったら、必ず renderList を呼んで画面を最新にする」というルールを自分の中に作ると、コードが整理されていきます。
初期表示でも renderList を呼んでおく
「最初の状態」も関数で描く
ファイルの最後に、次の1行を足しておきます。
renderList();
JavaScriptこれで、ページを開いた瞬間にも「まだ誰も登録されていません。」というメッセージが表示されます。
つまり、「初期状態の描画」も「追加後の描画」も、同じ関数でやっていることになります。
この「状態が変わったら render、最初も render」というパターンは、
現代のフロントエンドフレームワーク(React など)にも通じる、とても大事な考え方です。
今はそこまで意識しなくていいですが、「画面は状態の結果である」という感覚だけ持っておいてください。
少し発展:削除機能をどう考えるか
まずは「考え方」だけ触れておく
今日は実装まではやりませんが、
「もし削除機能を付けるならどうするか」を少しだけ考えてみます。
例えば、「3人目を削除したい」となったとき、
やるべきことは二つです。
people 配列から「3人目の要素」を取り除く。
そのあと renderList() を呼んで、画面を描き直す。
つまり、「画面を直接いじって消す」のではなく、
「配列(状態)を変えてから、画面は render に任せる」という流れは変わりません。
この「状態を変える → 画面は関数で再描画」という筋を通しておくと、
機能が増えてもコードがぐちゃぐちゃになりにくくなります。
6日目で一番大事な感覚
「配列が“アプリの状態”になった」
今日あなたが手に入れたのは、
配列を「アプリの状態」として扱う感覚です。
people という配列に「今登録されている人たち」が全部入っている。
画面は、people をもとに renderList が描いているだけ。
追加ボタンを押すと、people が変わり、renderList が呼ばれて画面が更新される。
この構造が見えた時点で、あなたはもう「アプリの骨格」を理解しています。
あとは、ここに「削除」「編集」「検索」などの機能を少しずつ足していくだけです。
6日目のまとめ
今日のキーポイントを短くまとめると、こうなります。
HTML側に「入力欄」「ボタン」「一覧表示エリア」を用意し、id で名前を付けた。
JavaScript側で getElementById を使って、それらを変数としてつかんだ。
people 配列を「名簿データの本体」として持ち、1人分をオブジェクトで表現した。
renderList 関数で「people の中身から画面の一覧を描く」処理をまとめた。
ボタンのクリックイベントで、入力値のチェック → オブジェクト作成 → 配列に追加 → renderList という流れを書いた。
次の7日目では、この名簿ミニアプリを少し発展させて、
「検索」や「並び替え」といった“ちょっと便利な機能”に踏み込んでいきます。
もし余裕があれば、
今日のアプリに「年齢が20歳以上の人だけを表示するボタン」や
「登録人数を別の場所に表示する」などを自分で考えて足してみてください。
その試行錯誤こそが、アプリ開発の一番おもしろい部分です。
