1

时分秒倒计时组件

template

<template>
  <!-- 倒计时组件 -->
  <div class="downTime-wrapper">
    <!-- 这里是显示还未结束时的内容,这里只是我这得布局,你可以随意。 -->
    <div class="time" v-show="!isShow">
      <!-- <span class="hour">{{myDay}}</span> : -->
      <div class="hour">
        <span>{{ getHours1 }}</span>
        <span>{{ getHours2 }}</span>
      </div>
      <span class="dian">:</span>
      <div class="minute">
        <span>{{ getMinutes1 }}</span>
        <span>{{ getMinutes2 }}</span>
      </div>
      <span class="dian">:</span>
      <div class="second">
        <span>{{ getSeconds1 }}</span>
        <span>{{ getSeconds2 }}</span>
      </div>
    </div>
    <!-- 这里是显示结束后的内容 -->
    <span class="second" v-show="isShow">{{clocker}}</span>
  </div>
</template>

script

<script>
export default {
  name: 'downTime',

  props: { // 接收父组件传递过来的参数,这里传了  结束时间 - 开始时间 - 结束后显示的内容
    endTime: {
      type: Number
    },
    startTime: {
      type: Number
    },
    endMsg: {
      type: String
    }
  },

  data () {
    return {
      isShow: false, // 控制显示结束或还未结束显示的内容
      clocker: '', // 结束后显示的内容
      timeObj: null, // 时间对象,下方会用到
      myDay: 0, // 我定义来接收计算出来的 天 的
      myHours: 0, // 我定义来接收计算出来的 小时 的
      myMinutes: 0, // 我定义来接收计算出来的 分钟 的
      mySeconds: 0// 我定义来接收计算出来的 秒钟 的
    }
  },
  computed: {
    getHours1 () {
      return this.myHours < 10 ? 0 : parseInt((this.myHours % 100) / 10)
    },
    getHours2 () {
      return parseInt(this.myHours % 10)
    },
    getMinutes1 () {
      return this.myMinutes < 10 ? 0 : parseInt((this.myMinutes % 100) / 10)
    },
    getMinutes2 () {
      return parseInt(this.myMinutes % 10)
    },
    getSeconds1 () {
      return this.mySeconds < 10 ? 0 : parseInt((this.mySeconds % 100) / 10)
    },
    getSeconds2 () {
      return parseInt(this.mySeconds % 10)
    }
  },
  mounted () {
  },
  methods: {
    option () {
      // 计算时间差
      let timeLag = (this.endTime - this.startTime) / 1000
      // 判断当前是否时分秒的值是否大于10
      const add = num => {
        return num < 10 ? '0' + num : num
      }
      // 时间倒计时运算的方法
      const timeFunction = () => {
        const time = timeLag--
        this.timeObj = { // 时间对象
          seconds: Math.floor(time % 60),
          minutes: Math.floor(time / 60) % 60,
          hours: Math.floor(time / 60 / 60) % 24,
          days: Math.floor(time / 60 / 60 / 24)
        }
        // 计算出时分秒
        this.myDay = `${add(this.timeObj.days)}`
        this.myHours = `${add(this.timeObj.hours)}`
        this.myMinutes = `${add(this.timeObj.minutes)}`
        this.mySeconds = `${add(this.timeObj.seconds)}`
        // 当时间差小于等于0时,停止倒计时
        if (time <= 0) {
          this.isShow = true
          this.clocker = this.endMsg
          clearInterval(go)
        }
      }
      // 开始执行倒计时
      timeFunction()
      // 每一秒执行一次
      const go = setInterval(() => {
        timeFunction()
      }, 1000)
    }
  },
    watch: {
        endTime: {
          handler (newName, oldName) {
            this.option()
          },
          immediate: true,
          deep: true
        }
     }
}
</script>

备注:我将时分秒使用计算属性分成了个位和十位两部分展示,在watch中深度监听endTime属性的变化并重新调用定时器

style

<style lang="scss" scoped>
.downTime-wrapper{
  display: inline-block;
  .dian {
    font-weight: bold;
    position: relative;
    top: -5px;
  }
  .hour{
    display: inline-block;
    font-size: 36px;
    span {
      border-radius:6px;
      color: #FFFFFF;
      background:rgba(27,23,22,1);
      padding: 1px 10px;
      margin: 0 2px;
    }
  }
  .minute{
    display: inline-block;
    font-size: 36px;
    span {
      border-radius:6px;
      color: #FFFFFF;
      background:rgba(27,23,22,1);
      padding: 1px 10px;
      margin: 0 2px;
    }
  }
  .second {
    display: inline-block;
    font-size: 36px;
    margin-top: -5px;
    span {
      border-radius:6px;
      color: #FFFFFF;
      background:rgba(27,23,22,1);
      padding: 1px 10px;
      margin: 0 2px;
    }
  }
}
</style>

使用

在页面中引入并注册后即可使用

<timer
  :endTime="item.endTime"
  :startTime="new Date().getTime()"
  :endMsg="item.endMsg">
</timer>

毫秒倒计时效果

在template中加入
<b id="timehs">:00</b>

声明timeDt方法

methods: {
    timeDt () {
      this.timer1 = setTimeout(function () {
        var haomiao = 99
        document.getElementById('timehs').innerHTML = ':' + haomiao
        this.timer2 = setInterval(function () {
          const timehs = document.getElementById('timehs')
          if (timehs) {
            timehs.innerHTML = `:${haomiao < 10 ? `0${haomiao}` : haomiao}`
          }
          haomiao--
          if (haomiao < 0) {
            haomiao = 99
          }
        }, 10)
      }, 1000)
    }
  }

在create生命周期函数中调用timeDt方法

created () {
    this.$nextTick(() => {
      this.timeDt()
    })
  },

YoLinDeng
545 声望520 粉丝

等到秋叶终于金黄,等到华发悄然苍苍。