Counter(カウンター) App
最終更新
最終更新
今回はCounter(カウンター) Appを作成します。これは数を数える単純なアプリです。
プラス(+)ボタンを押すと、現在の値を1ずつ増やし、マイナス(-)ボタンを押すと、現在の値から1ずつ減らします。
HTMLはシンプルにbuttonとspanのみとなります。それぞれJSから参照できるように固有のidを持っています。
CSSで注目したいのは .wrapper
に指定されている display: inline-block;
です。 .wrapper
を持つ要素は div
タグなのでデフォルトではブロックレベル要素(つまり display: block
が元々適用されている)です。これを inline なブロックとするために、 display: inline-block;
を指定しています。
display: block;
のままだと、上記のように行いっぱいまでborderが伸びてしまっています。今回は 子要素のbuttonを囲むようなスタイルにしたかったので、 display: inline-block;
としました。良く使う指定方法なので覚えておきましょう。
JSは今回は jQuery を使わずに、ブラウザの標準APIだけで実装しています。モデルの部分は前回のMVVMの実装例で使った Proxy というクラスを利用しています。(IE11では動かないので注意してください) ポイントは以下の通りです。
Proxyの第二引数に指定した set()
関数の中で、 counter.innerText = "任意の値"
とすることで、 id="counter"
な要素のテキストを置き換える。(= 値が増減する)
プラス・マイナスボタンのクリックイベントのハンドラの中では、モデルの値の変更を行う。そうすることで、前述の counter.innerText の更新が呼び出され、画面内のカウンターの値が増減する。
ここまでで基本的なカウンターの基本的な動きは出来ました。ですが現状は実行し直すと(タブ/画面をリロードすると)値が0に戻ってしまいます。このデータを保存(save)するためにはどうしたら良いでしょうか?
実際のWebアプリケーションでは対応するバックエンド(APIサーバ)を用意する事が多いですが、今回はかんたんに試すために、ブラウザの localStorage
という機能を使って作りました。
画面に save(保存) と restore(復元) のボタンが増えています。値を変更した後に、 save を押すと保存され、ページをリロード(もしくはCodePenの右下の Rerun
ボタンを押す)した後に、 restore ボタンを押すと、以前の値が復元されるのが分かるかと思います。関連するコードを見てみましょう。(HTML/CSSは今回は割愛します)
HTML上にボタンを増やした(save/restore)のに合わせて、JSでの要素の参照を取得するコードが増えています。まず最新の値を保存(save)するコードから見ていきます。
ブラウザの localStorage
APIの setItem()
メソッドを呼び出しています。第一引数にキー名(今回は "COUNTER_VALUE_KEY" )、第二引数に保存する値 JSON.stringify(model.value)
としています。今回保存するのは最新の値の 数値 なので、正しく数値として扱えるように JSON.stringify
関数を使って、JSON化しています。続いて、以前の値を復元(restore)するコードを見ていきます。
ここでは、まずブラウザの localStorage
APIの getItem()
メソッドを呼び出しています。第一引数に取得するキー名( 今回は "COUNTER_VALUE_KEY" )を指定することで、localStorageに保存された値を取得できます。取得した値を JSON.parse()
関数に渡すことで、JSON文字列から、JSの数値型としてparse(パース/解析)しています。その数値を model.value
に渡すことで、通常の増減の場合と同様に画面に反映されます。
ここまでで保存機能を備えたCounter(カウンター)アプリは実装できました。今回は保存/復元を localStorage を使ってやりましたが、保存/復元ボタンを押した時の処理をバックエンド(APIサーバ)へのリクエスト(データの更新/取得)に置き換えることで、より本格的なWebアプリケーションを作ることができます。もし興味があれば作ってみてください。
続いては、より アプリ っぽいToDo(タスク管理)アプリを作ってみます。