4

微改版的Vue倒计时插件

 3 years ago
source link: http://www.lzhpo.com/article/105
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

组件源代码

<template>  <div>    <p v-if="msTime.show">      <span v-if="tipShow">{{tipText}}</span>      <span v-if="!tipShow">{{tipTextEnd}}</span>      <span v-if="msTime.day>0"><span>{{msTime.day}}</span>{{dayTxt}}</span>      <span>{{msTime.hour}}</span>{{hourTxt}}      <span>{{msTime.minutes}}</span>{{minutesTxt}}      <span>{{msTime.seconds}}</span>{{secondsTxt}}    </p>    <p v-if="!msTime.show">{{endText}}</p>  </div></template><script>export default {  name: 'MyCountDown',  replace: true,  data () {    return {      tipShow: true,      msTime: { // 倒计时数值        show: false, // 倒计时状态        day: '', // 天        hour: '', // 小时        minutes: '', // 分钟        seconds: '' // 秒      },      star: '', // 活动开始时间      end: '', // 活动结束时间      current: '' // 当前时间    }  },  watch: {    currentTime: function (val, oldval) {      this.gogogo()    }  },  props: {    // 距离开始提示文字    tipText: {      type: String,      default: '距离开始'    },    // 距离结束提示文字    tipTextEnd: {      type: String,      default: '距离结束'    },    // 时间控件ID    id: {      type: String,      default: '1'    },    // 当前时间    currentTime: {      type: Number    },    // 活动开始时间    startTime: {      type: Number    },    // 活动结束时间    endTime: {      type: Number    },    // 倒计时结束显示文本    endText: {      type: String,      default: '已结束'    },    // 自定义显示文字:天    dayTxt: {      type: String,      default: ':'    },    // 自定义显示文字:时    hourTxt: {      type: String,      default: ':'    },    // 自定义显示文字:分    minutesTxt: {      type: String,      default: ':'    },    secondsTxt: {      type: String,      default: ':'    },    // 是否开启秒表倒计,未完成    secondsFixed: {      type: Boolean,      default: false    }  },  mounted () {    console.log(this)    this.gogogo()  },  methods: {    gogogo: function () {      // 判断是秒还是毫秒      this.startTime.toString().length === 10 ? this.star = this.startTime * 1000 : this.star = this.startTime      this.endTime.toString().length === 10 ? this.end = this.endTime * 1000 : this.end = this.endTime      if (this.currentTime) {        this.currentTime.toString().length === 10 ? this.current = this.currentTime * 1000 : this.current = this.currentTime      } else {        this.current = (new Date()).getTime()      }      if (this.end < this.current) {        /**         * 结束时间小于当前时间 活动已结束         */        this.msTime.show = false        this.end_message()      } else if (this.current < this.star) {        /**         * 当前时间小于开始时间 活动尚未开始         */        this.$set(this, 'tipShow', true)        setTimeout(() => {          this.runTime(this.star, this.current, this.start_message)        }, 1)        // eslint-disable-next-line no-mixed-operators      } else if (this.end > this.current && this.star < this.current || this.star === this.current) {        /**         * 结束时间大于当前并且开始时间小于当前时间,执行活动开始倒计时         */        this.$set(this, 'tipShow', false)        this.msTime.show = true        this.$emit('start_callback', this.msTime.show)        setTimeout(() => {          this.runTime(this.end, this.star, this.end_message, true)        }, 1)      }    },    runTime (startTime, endTime, callFun, type) {      let msTime = this.msTime      let timeDistance = startTime - endTime      if (timeDistance > 0) {        this.msTime.show = true        msTime.day = Math.floor(timeDistance / 86400000)        timeDistance -= msTime.day * 86400000        msTime.hour = Math.floor(timeDistance / 3600000)        timeDistance -= msTime.hour * 3600000        msTime.minutes = Math.floor(timeDistance / 60000)        timeDistance -= msTime.minutes * 60000        // 是否开启秒表倒计,未完成        //                    this.secondsFixed ? msTime.seconds = new Number(timeDistance / 1000).toFixed(2) : msTime.seconds = Math.floor( timeDistance / 1000 ).toFixed(0);        msTime.seconds = Math.floor(timeDistance / 1000).toFixed(0)        timeDistance -= msTime.seconds * 1000        if (msTime.hour < 10) {          msTime.hour = '0' + msTime.hour        }        if (msTime.minutes < 10) {          msTime.minutes = '0' + msTime.minutes        }        if (msTime.seconds < 10) {          msTime.seconds = '0' + msTime.seconds        }        let _s = Date.now()        let _e = Date.now()        let diffPerFunc = _e - _s        setTimeout(() => {          if (type) {            this.runTime(this.end, endTime += 1000, callFun, true)          } else {            this.runTime(this.star, endTime += 1000, callFun)          }        }, 1000 - diffPerFunc)      } else {        callFun()      }    },    start_message () {      this.$set(this, 'tipShow', false)      this.$emit('start_callback', this.msTime.show)      setTimeout(() => {        this.runTime(this.end, this.star, this.end_message, true)      }, 1)    },    end_message () {      this.msTime.show = false      if (this.currentTime <= 0) {        return      }      this.$emit('end_callback', this.msTime.show)    }  }}</script>

引入组件,使用:

<my-count-down v-on:start_callback="countDownS_cb(1)"               v-on:end_callback="countDownE_cb(1)"               :current-time="currentTime" :start-time="startTime" :end-time="endTime"               :tip-text="'距离考试开始'" :tip-text-end="'距离考试结束还有'" :end-text="'考试结束'" :dayTxt="'天'" :hourTxt="'时'" :minutesTxt="'分'" :secondsTxt="'秒'"></my-count-down>
    // 倒计时    countDownS_cb: function (x) {      this.$notify({        title: '考试提示',        message: '考试开始',        type: 'warning',        duration: 2000      })    },    // 考试结束    countDownE_cb: function (x) {      this.$notify({        title: '考试提示',        message: '考试结束',        type: 'warn',        duration: 2000      })    }

Vue计时器vue2-countdown无法显示文字的解决办法-2.png


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK