LoginSignup
3
2

俺からReact, Vueを学んでみないか?リアルな電卓を作ってみよう!

Posted at

俺からReact, Vueを学んでみないかシリーズ

無茶苦茶調子に乗ったタイトルですが、インプレッションを集めるために煽っているだけです。すみません。

誰も使ってくれないだろう無駄なもの(HTML/CSSで作る超リアルな電卓など)をどんどんアウトプットしていこうという企画です。

リアルな電卓はお好きですか?

今回はリアルな電卓を作成しましたwww
皆さんが想像しているよりリアルです。心の準備は宜しいでしょうか?

作成したといっても、NextjsにHTML/CSSを反映させただけですけど、、、
とはいえ、reactjsで動くように無茶苦茶修正しましたし、JavaScriptも修正が大変でした。


完成物

下記から確認できます!
https://dashboard-next-ui.vercel.app/next-ui

スクリーンショット 2023-12-08 14.58.26.png

無茶苦茶リアルwww

githubリポジトリ
https://github.com/kouhei-github/dashboard-next-ui


Reactの工夫したところ

管理画面のデザインも自分で作成したのですが、ここの解説はめんどくさいのでやりません。
layout.tsxをうまく活用してください。

電卓の計算のロジック

計算のロジックは一筋縄では行きませんでした。


第一の壁 四則演算の規則

皆さん馴染みの乗算・徐算は加算・減算より優先される

1+2+3×4 = 36

リアルタイムで計算する電卓を想定していたので、前回の結果を元に計算したかった。
下記のように足し算を優先させる必要があった

(1+2+3)×4 = 24

どのように実装したかというと、乗算・徐算が含まれると先頭に(をつける

    if(func.includes("x") || func.includes("÷")){
      func ="(" + func
    }

乗算・徐算の前に)をつける

    const result = func.replaceAll("x", ")*").replaceAll("÷", ")/").replaceAll("nothing", "").replaceAll("=", "")
    

下記のようになる

((1+2+3)×4+8)/2 = 16

第2の壁 計算のロジックが複雑になる

計算のロジックが複雑になるため、文字列をそのままJavaScriptのコードとして実行できないか考えた。
するとeval() 関数なるものが見つかった

// 引数に入れた文字列を実行できる
eval("((1+2+3)×4+8)/2") // 16

ただ脆弱性になりうる可能性があるため、あまりよくないらしい!

所感

世界でいちばん使われないだろう、リアルすぎる電卓アプリを作ったが、電卓のロジックは奥が深いことを学べた。
次はクレジット決済画面をかっこよくデザインして、デプロイしてみる。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2