これまで肉体労働を中心に働いてきたが、キャリアチェンジを決意し、未経験からIT企業への転職が決まった。
入社前に求められるスキルの一つが TypeScript。これまで実務で触れたことがなかった自分にとって、JavaScriptとの違いや考え方は想像以上に難しく感じた。
特に悩んだのが「イベントデリゲーション」という考え方だ。
ボタンにイベントを付けたはずなのに、配列を更新したらクリックできなくなる。
どのボタンが押されたのかも分からない。
この記事では、TypeScriptのイベントデリゲーションについて、ToDoリストアプリを自作しながら学んだ内容を整理する。
なぜイベントが消えるのか、どうすれば解決できるのかを、初心者視点で丁寧にまとめていく。
TypeScriptのイベントデリゲーションとは何か
イベントデリゲーションとは、子要素ではなく親要素にイベントを設定する仕組みのことだ。
クリックイベントなどは、実際には「イベントの伝播」によって親要素まで伝わってくる。
この仕組みを利用することで、
- 動的に生成された要素にも対応できる
- イベントリスナーの数を減らせる
といったメリットがある。
今回作成したToDoリストでは、「完了ボタン」「削除ボタン」がタスクごとに動的に生成されるため、イベントデリゲーションが必須だった。
配列を再レンダリングするとイベントが消える理由
最初に詰まったポイントはここだった。
ボタンに直接 addEventListener を設定していたが、タスクを追加・削除するたびにクリックが効かなくなる。
原因はシンプルで、DOMを作り直しているからだ。
ToDoリストでは、配列を元に要素を生成し直す「再レンダリング」を行っている。
再レンダリング時に起きていることは以下の通りだ。
- 既存の要素をすべて削除
- 新しい要素を作成
- 以前のイベントリスナーは失われる
つまり、いくらボタンにイベントを設定しても、そのボタン自体が消えているため意味がなかった。
この問題を解決するために使ったのが、イベントデリゲーションだった。
どのボタンが押されたかを判別する方法
イベントデリゲーションでは、親要素にイベントを設定し、event.target を使って実際に押された要素を特定する。
今回の実装では、ボタンに以下のようなIDを付けた。
comp-0dele-1
これにより、クリックされた要素のIDからタスク番号を取り出せる。
const target = e.target as HTMLElement;
const idNum = Number(target.id.replace("comp-", ""));
どのボタンが押されるか事前に分からなくても、
命名規則+文字列操作で安全に判定できるのがポイントだった。
まとめ
TypeScriptのイベントデリゲーションは、
動的に要素を生成する場面では避けて通れない考え方だと感じた。れらをToDoアプリを通して理解できたことで、
単なる知識ではなく「使える感覚」に近づいた気がする。
未経験からのキャリアチェンジは不安も多いが、
こうして学びを言語化しながら積み上げていくことで、
少しずつ前に進めている実感がある。
今後もTypeScriptの学習記録を、記事としてアウトプットしていく予定だ。


コメント