Counter(カウンター) App

今回はCounter(カウンター) Appを作成します。これは数を数える単純なアプリです。

Counter(カウンター)アプリの実装

プラス(+)ボタンを押すと、現在の値を1ずつ増やし、マイナス(-)ボタンを押すと、現在の値から1ずつ減らします。

HTMLはシンプルにbuttonとspanのみとなります。それぞれJSから参照できるように固有のidを持っています。

CSSで注目したいのは .wrapper に指定されている display: inline-block; です。 .wrapper を持つ要素は div タグなのでデフォルトではブロックレベル要素(つまり display: block が元々適用されている)です。これを inline なブロックとするために、 display: inline-block; を指定しています。

"display: inline-block;" の場合
"display: 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 という機能を使って作りました。

保存/復元機能の付きのCounter(カウンター)アプリの実装

画面に 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(タスク管理)アプリを作ってみます。

最終更新

役に立ちましたか?