Nuxtでストップウォッチ(タイマー)を作る
Vue.js&Nuxt.js超入門 を読みました。
アウトプットとして、タイムトラッキング機能のあるシンプルなタスク管理ツールを作ろうと思います。
ということで、まずはタイマーを作っていきましょう。
pages/index.vue
data () {
    return {
      sec: 0,
      timerOn: false,
      timerObj: null,
    }
},
methods: {
    count: function() {
      this.sec += 1
    },
    start: function() {
      var self = this;
      this.timerObj = setInterval(function() {self.count()}, 1000)
      this.timerOn = true; 
    },
    stop: function() {
      // ここにタイムを保存する処理を書く
      this.sec = 0
      clearInterval(this.timerObj);
      this.timerOn = false; 
    },
使用する関数はこんな感じ。時間は秒数で保持しておき、表示する際にHH:MM:SS表記に直します。
1秒ごとにインクリメントしていくtimerObjを用意してあげるのが肝ですね。timeOnはタイマーのスタートボタンとストップボタンを切り替えるのに用います。
template部を書いてあげて、
pages/index.vue
  <div>
    {{ formatTime }}
    <br>
    <b-button @click="start" v-if="!timerOn">start</b-button>
    <b-button @click="stop" v-if="timerOn">stop</b-button>
  </div>
秒をHH:MM:SS表記に直す処理は汎用性があるので、mixinに書いていきます。
pages/index.vue
computed: {
    formatTime: function() {
      return this.SecToTime(this.sec)
    },
  },
plugins/mixin-common-methods.js
import Vue from 'vue'
Vue.mixin({
  methods: {
    SecToTime: function(rawsec){
      var sec = String((rawsec % 60)%60)
      if (sec.length == 1){sec = "0" + sec}
      var min = String(Math.floor(rawsec / 60) % 60)
      if (min.length == 1){min = "0" + min}
      var hour = String(Math.floor(rawsec / 3600))
      if (hour.length == 1){hour = "0" + hour}
      var time = hour + ":" + min + ":" + sec
      return time
    },
  },
})
これにて完成です。
あとはタスク管理機能とうまく組み合わせていきたいと思います。
https://github.com/hukurouo/tasktime

今はこんな感じ。Buefyを初めて使ってみましたが、マテリアル度が高くてよいですね。