派大星爱吃小鱼干

vue中封装倒计时组件

2019-04-26  本文已影响1人  程序猿阿峰

你或许遇到过,在项目里总会有倒计时,而且是多处用到,这样,你就不得不考虑下复用了


效果图

代码如下

downTime.vue 这只是个组件名称,或许你不喜欢。

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

<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// 我定义来接收计算出来的 秒钟 的
    }
  },

  mounted () {
    // 计算时间差
    let timeLag = (this.endTime - this.startTime) / 1000
    // 判断当前是否时分秒的值是否大于10
    let add = num => {
      return num < 10 ? '0' + num : num
    }
    // 时间倒计时运算的方法
    let timeFunction = () => {
      let 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()
    // 每一秒执行一次
    let go = setInterval(() => {
      timeFunction()
    }, 1000)
  }
}
</script>

<style lang="scss" scoped>
.downTime-wrapper{
  font-size: 0.12rem;
  font-weight: bold;
  // .hour{}
  // .minute{}
  .second{
    color: rgb(235, 62, 61);
  }
}
</style>

父组件

<template>
  <!-- 这里传的是时间戳 -->
  <downTime
    :endTime="endTime"
    :startTime="new Date().getTime()"
    :endMsg="倒计时结束"
   />
</template>

然后就这样了 ↓


效果图,本来想动图的,想想还是算了,因为大家都懂的

不过这里有个问题,就是当前调用这个倒计时的组件被销毁后,倒计时还在后台继续执行,还没有解决!


期待你的答案

好了。下次我忘了再打开看看。

上一篇 下一篇

猜你喜欢

热点阅读