/components/Logo.vue
で、カウンターの値を受け取りロゴを回転する CSS を追加します。
ロゴ全体を回転させるため、現在の HTML テンプレートの実装部分を<div :style="rotation">
でラップします。
回転の CSS はstyle
属性直接に、rotation
プロパティ経由で設定します。
1 | <template> |
後はcounter
の値を使って CSS を作るだけですが、CSS アニメーションを再実行できるようにするため、一手間かけています。(スクリプト全文)
/pages/index.vue
で絵文字ボタンを押されると、props: counter
に新しい値がセットされます。それをwatch
で監視していて、変化があるとwatch: counter
を呼び出します。watch: counter
は、data
プロパティにアニメーションの CSS をオブジェクトとして設定します。いったんアニメーション無し{ animation: 'none' }
をセットし、10ミリ秒後に{ animation:
rotate 1s linear 0s ${ value } forwards}
をセットします。(アニメーション再実行のトリック)computed: rotation
経由で作られた CSS オブジェクトを HTML テンプレートへ渡します。1 | export default Vue.extend({ |
だいぶ TypeScript の型が登場しました。computed: rotation
では、戻り値がobject
で CSS の文字列ではないことがわかります。watch: counter
では、引数がnumber
型です。(フレームワークからの呼出し&テンプレートリテラルなので型明示のメリットはあまりないですが)
なお、CSS のアニメーション定義は下記です。
1 | @keyframes rotate { |
このくらいの規模だと型定義によるメリットはまだまだありませんが、アニメーションのためのトリックとは言え色々と取り回ししているので、他人の書いたこんなコードが急に出てきたと思うと型情報ぐらいあると嬉しいのではないでしょうか。
yarn dev
で開発サーバーを起動し、ブラウザでhttp://localhost:3000/
へアクセスします。
※ 開発サーバーは常に立ち上げておいて大丈夫です。実際の開発に当たってはホットリロードを活用し、コードを保存するとブラウザが自動でリロードしてくれます。
今回作成した部分までのソースを GitHub へアップしました。
https://github.com/riotz-works/samples-pwa-base-app/tree/0.0.2
GitHub Pages にホスティングもしました。
(公開サイトは1つのため記事公開に合わせて変わり、本記事の内容とは異なります)
https://riotz.works/samples-pwa-base-app/
ベースアプリを TypeScript 化できました。
今回のカウンターボタンぐらいだとコーディング量が増えるだけでメリットが感じられませんが、他の人が書いた共通ライブラリを使うときなどに型があることで助かることが増えてきます。
型を導入できたところで Lint も入れたいところですが、こちらの話はまた重いので別途書きます。
もし使たい場合は、公式ドキュメントESLint を使った Linting - TypeScript サポート - Nuxt.jsをご参照ください。