ボタンが反応しない
初段 / 目安 15分
昼のオフィスで、琥珀さんが手招きしています。「夜だけじゃなくて、昼の顔も見せようか。商店街サイトのフロント……前任者が残したウィジェットたちが、呪われてるんだ。動いてるように見えて、触ると壊れる。供養(デバッグ) を頼めるかな」。
この道場は全問、壊れたコードから始まります。ゼロから書くのではなく、すでにそこにある呪いを見つけて祓うのが仕事です。
最初の供養依頼はこれです。琥珀「スタンプラリーの『押す』ボタン、押しても無反応って苦情が3件。コードは……一見普通なんだよね」。
画面を見ると、スタンプの数が className="stamp-count" の段落に出ていて、ボタンもちゃんと並んでいます。押しても何も起きません。エラーで真っ赤になるわけでもなく、静かに無反応です。
こういうときにまず疑うのは イベントがそもそも正しく繋がっているか です。React では onClick に渡した関数が、クリックのたびに呼ばれます。名前が1文字ずれているだけで、繋がる相手はまったく別の関数になります。それでもエラーは出ません。JavaScript から見れば、どちらも「ちゃんと存在する関数」だからです。
エラーが出ないタイプの故障 が、いちばん見つけにくい呪いです。画面は普通に出ているし、コンソールも静かで、ただ何も起きない。ここで頼りになるのは、憶測ではなく実際に動かして確かめる手順です。
切り分けの手順は決まっています。まず、増やしたい処理の中に console.log を1行入れてボタンを押します。ログが出ないなら、その処理は そもそも呼ばれていません。呼ばれてすらいないなら、疑うべきは処理の中身ではなく繋ぎ方です。そこまで分かれば、あとは onClick に書いた名前と、このファイルにある関数の名前を並べて見比べるだけです。
完成条件
- ボタンを押すたびに、
classNameが stamp-count の段落の数が1ずつ増える - スタンプ数は state で持ったまま、そこは壊さない
進め方
初期コードのスタンプ数は最初から useState で持たせてあり、数を増やす処理も中身は正しく書いてあります。呪われているのは繋ぎの一点だけ です。大きく書き直す必要はありません。使われていない関数が1つ残っているはずなので、それも一緒に供養して構いません。
直したら、必ず自分でボタンを押して数が増えることを確かめてください。デバッグは「直したつもり」がいちばん危ないので、症状が消えたことを目で見るところまでが1セットです。
ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。
供養が済んだら、琥珀さんはこう言うはずです。「タイポって、いちばん人間らしい呪いだよね」。
ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです