#8::虚偽の報告とNaN地獄との戦いだじゃ
この回では「虚偽の報告をした回数」をアプリに表示させようとして、NaN
(数値じゃないよ)というバグに悩まされながらも、localStorage
とReactのuseState
とuseEffect
を駆使してバグを撃退した話だじゃ。単なる確認ダイアログ一つでも、裏ではけっこうややこしい処理が動いてんだな~っていう話だっきゃ。
あんた、ボタン押したら「虚偽の報告をしたということか?」って聞かれて、「はい」って押したら、数字が1増える。そんな単純なもんだと思ってだべ?
おらもそう思ってたんず。でも実際はな、甘くねんだじゃ。
虚偽の報告、したんだべ?という演出
このアプリは「懲役一年」ってコンセプトで、サボりそうになるユーザーに圧をかけるRPG風習慣化ツールだじゃ。
で、「本日の作業完了を報告」ってボタンを押したあとに、「嘘じゃねぇべな?」って脅しのダイアログが出る仕様にしたくてな。
んだば、もしユーザーがうっかり完了ボタン押したあとで「やっぱやってねがったわ…」ってなったら?
そんとき用に「報告の訂正」ボタンもつけで、ステータス戻して「虚偽の報告をした回数」も1増やすようにしたんず。
それなのに…再読み込みで「0回」に戻る謎現象
見た目は動いてらんず。完了 → 訂正 → アラート → 「1回」って表示される。
…のに!ページ再読み込みしたら、「0回」に戻るんず!
「なんでだぁーー!」って思って、localStorage
見たら値はちゃんと保存されでらのに、画面では「0回」に戻る。
おら、ReactのuseEffect
がうまく働いてねぇんでねがって見直してみたんず。
NaN(ナン)ってなんだよ!
しかも途中から「NaN回」とか表示されはじめてな。
「なんだこれ、なんだこれ!」って調べたら、localStorage.getItem()
で取った文字列を数値に変換すんのにNumber()
使ってたんず。でもな、それが空だったりnullだったりしたらNaN
(Not a Number=数じゃね)になるらしんず。
だから、
jsコピーする編集するconst savedFalseReportCount = localStorage.getItem('falseReportCount');
if (savedFalseReportCount !== null && !isNaN(parseInt(savedFalseReportCount, 10))) {
setFalseReportCount(parseInt(savedFalseReportCount, 10));
} else {
setFalseReportCount(0);
}
って風に、慎重に変換するようにしたっきゃ。
修正して、やっと地獄から解放
あと、「報告の訂正」ボタンを押したとき、setFalseReportCount(prev => prev + 1)
だけじゃ駄目で、
すぐにlocalStorage.setItem('falseReportCount', newCount);
で保存してやらねばなんねがった。useEffect
で保存するだけだと、反映が次の描画まで遅れるからだな。
結局は「ただの確認ダイアログ」でも裏は深い
ユーザーはただ「はい」とか「いいえ」押してるだけだけど、裏じゃuseState
とlocalStorage
が絡み合って戦ってらんず。
演出ってのは、見えない所での戦いでできてんだな~って思った瞬間だったじゃ。
この日、おらは「虚偽の報告」と「NaN」の恐ろしさを知った。
そして少しだけ、Reactが好きになった気がするんず。
次もまた、変なバグと戦いながら、地道に前に進むべさ。
●ホームページ
アプリ制作1000時間の知識を使って作ったHPも見てほしいべさ

ゲームに見えるかもしんねぇけんども、これ、ホームページなんだべ。アプリ制作1000時間、めっちゃしんどがったけんども、そのおかげで色んなことできるようになったべさ。これからもどんどん更新していぐがら、応援よろしく頼むべ!
ちなみに、このHPのコンセプトは「日本人の勤勉さを取り入れだ、世界一ストイックな方法で、世界中の人たぢの夢の設定がら到達までを総合サポートすること」なんだべさ。学習×運動×睡眠×栄養×時間、この5つの軸を使っていぐど。おらも今、これを実践中だべ!
んでもってな、このHPを通じて夢を叶えだ人たぢと一緒に、いずれ世界をひっくり返すような仕事をしたいと思ってんだべ!ただの応援で終わりじゃねぇ。ここで鍛えた力で、みんなと一緒にとんでもねぇことを仕掛けていぐ。
一緒にでっかい夢、つかまねぇが?
コメント