vue定时器,刷新页面继续计时

子组件

<template>
  <div>
    <span
        :sendSync="sendSync"
        :autoStart="autoStart"
        :defaultVal="defaultVal"
    >{{countString}}</span>
  </div>
</template>
<script>
export default {
  data() {
    return {
      isStart: false,
      globalTimer: null,//获取setInterval对象值
      countString: '', //用来显示时间
      day: 0,
      hour: 0,
      minute: 0,
      second: 0,
      millisecond: 0,
      countVal: this.defaultVal, //获取初始值
      pauseTime: 0,
    }
  },
  watch: {
    'countVal': {
      deep: true,
      handler: function(val, oldVal) {
        let vm = this
        if (vm.needSendSunc) {
          vm.passToParent(val)
        }
      }
    },
    'needSendSunc': {
      deep: true,
      handler: function(val) {
        let vm = this
        if (val) {
          vm.passToParent(vm.countString)
        }
      }
    }
  },
  props: {
    sendSync: {
      type: Boolean,
      default: false,
    },
    autoStart: {
      type: Boolean,
      default: false,
    },
    defaultVal: {
      type: Number,
      default: null,
    }
  },
  created() {
    if (this.autoStart) {
      this.startCountFn()
    }
  },
  computed: {
    needSendSunc: function() {
      return this.sendSync
    }
  },
  methods: {
    counterFn(counterTime) {
      let leave1 = counterTime % (24 * 3600 * 1)    //计算天数后剩余的毫秒数
      let leave2 = leave1 % (3600 * 1)        //计算小时数后剩余的毫秒数
      let leave3 = leave2 % (60 * 1)      //计算分钟数后剩余的毫秒数
      let day = Math.floor(counterTime / (24 * 3600 * 1)) //计算相差天数
      let hour = Math.floor(leave1 / (3600 * 1))//计算相差小时
      let minute = Math.floor(leave2 / (60 * 1))//计算相差分钟
      let second = Math.round(leave3 / 1) //计算相差秒
      day=day>=10?day:'0'+day
      hour=hour>=10?hour:'0'+hour
      minute=minute>=10?minute:'0'+minute
      second=second>=10?second:'0'+second
     this.countString = `${hour}:${minute}:${second}`;
    },
    startCountFn() {
      if (!this.isStart) {
          console.log(this.countVal)
        this.countVal = this.countVal ? this.countVal : 0
        let timer = setInterval(() => {
          this.counterFn(this.countVal++)
        }, 1000)
        this.globalTimer = timer
        this.isStart = true
      }
    },
    passToParent(data) {
      this.$emit("getDataFromChild", data)
    },
  }
}
</script>
<style>

</style>


父组件调用

<template>
  <div>
    <time-clock :autoStart="autoStart" :sendSync="sendSync" :defaultVal="defaultVal" @getDataFromChild="getDataFromChild"></time-clock>
  </div>
</template>

<script>
import timeClock from '@/components/Timer.vue'
export default {
  components:{
    timeClock
  },
  data() {
    return {
      autoStart:true,
      sendSync: true,
      defaultVal:sessionStorage.getItem('timer')?parseInt(sessionStorage.getItem('timer')):0
    }
  },
  methods: {
    getDataFromChild(data) {
      console.log(data)
      sessionStorage.setItem('timer',parseInt(data))
    }
  },
  created() {
     console.log(new Date().getTime())
  },
}
</script>

效果图

image.png

说明

本示例是在别人的技术上参考修改
原文地址:https://www.jianshu.com/p/0ec0c6e942f0
如有侵权请联系删除。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    zweic阅读 7,597评论 0 73
  • 冷清是一朵别样花 插在我半白的发鬓 没有人把我安放心底 我的QQ开着 微信开着 可是悲哀的很 连个搭讪都捕获不到 ...
    红小夭阅读 1,540评论 1 2
  • 第 1 章 不好的相遇 温晴,帝都大学的大一新生。人长的很漂亮,开学那天,穿着一身白色连衣裙,配上亮泽的秀...
    江西小刘阅读 1,475评论 0 0
  • 竹伊阅读 799评论 0 0
  • 今天,是我们数学教研的时候,上完第一节课,马上赶到教研室教研,刚一坐下,一位教二年级的同事慌慌张张跑到我旁边对我说...
    茌平张晓芬阅读 3,878评论 5 4