How do I create a simple 10 seconds countdown in Vue.js How do I create a simple 10 seconds countdown in Vue.js vue.js vue.js

How do I create a simple 10 seconds countdown in Vue.js


Please check if this works for you.

<template>   {{ countDown }}</template><script>    export default {        data() {            return {                countDown : 10            }        },        method: {            countDownTimer() {                if(this.countDown > 0) {                    setTimeout(() => {                        this.countDown -= 1                        this.countDownTimer()                    }, 1000)                }            }        }        created: {           this.countDownTimer()        }    }</script>


Whilst the accepted answer works, and is great, it can actually be achieved in a slightly simpler way by utilising Vue.js watchers:

<template>    {{ timerCount }}</template><script>    export default {        data() {            return {                timerCount: 30            }        },        watch: {            timerCount: {                handler(value) {                    if (value > 0) {                        setTimeout(() => {                            this.timerCount--;                        }, 1000);                    }                },                immediate: true // This ensures the watcher is triggered upon creation            }        }    }</script>

The benefit of using this method is that the timer can be immediately reset by simply setting the value of timerCount.

If you would like to play/pause the timer, then you can achieve this like so (note - this is not a perfect solution as it will round to the nearest second):

<template>    {{ timerCount }}</template><script>    export default {        data() {            return {                timerEnabled: true,                timerCount: 30            }        },        watch: {            timerEnabled(value) {                if (value) {                    setTimeout(() => {                        this.timerCount--;                    }, 1000);                }            },            timerCount: {                handler(value) {                    if (value > 0 && this.timerEnabled) {                        setTimeout(() => {                            this.timerCount--;                        }, 1000);                    }                },                immediate: true // This ensures the watcher is triggered upon creation            }        }        methods: {            play() {                this.timerEnabled = true;            },            pause() {                this.timerEnabled = false;            }        }    }</script>


Here is a component I made for a countdown timer :

<template>  <div>    <slot :hour="hour" :min="min" :sec="sec"></slot>  </div></template><script>export default {  props : {    endDate : {  // pass date object till when you want to run the timer      type : Date,      default(){        return new Date()      }    },    negative : {  // optional, should countdown after 0 to negative      type : Boolean,      default : false    }  },  data(){    return{      now : new Date(),      timer : null    }  },  computed:{    hour(){      let h = Math.trunc((this.endDate - this.now) / 1000 / 3600);      return h>9?h:'0'+h;    },    min(){      let m = Math.trunc((this.endDate - this.now) / 1000 / 60) % 60;      return m>9?m:'0'+m;    },    sec(){      let s = Math.trunc((this.endDate - this.now)/1000) % 60      return s>9?s:'0'+s;    }  },  watch : {    endDate : {      immediate : true,      handler(newVal){        if(this.timer){          clearInterval(this.timer)        }        this.timer = setInterval(()=>{          this.now = new Date()          if(this.negative)            return          if(this.now > newVal){            this.now = newVal            this.$emit('endTime')            clearInterval(this.timer)          }        }, 1000)      }    }  },  beforeDestroy(){    clearInterval(this.timer)  }}</script>