vue3-列表中-根据起始日期-同时实现正计时和倒计时

文章介绍了在Vue应用中使用定时器监控开始和结束时间,如何在组件卸载时正确销毁定时器以避免内存泄漏。作者展示了如何使用`onBeforeUnmount`生命周期钩子和响应式数据来管理定时器,并在跳转页面时清除它们。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<template>
 <button @click="tootherpage">跳转其他页面销毁定时器</button>
 <el-table :data="tableData.data" style="width: 100%">
    <el-table-column prop="starttime" label="开始时间"  />
    <el-table-column prop="startnow" label="距离开始时间"  />
    <el-table-column prop="endtime" label="结束时间" />
    <el-table-column prop="endnow" label="距离结束时间" />
  </el-table>
</template>
 
<script setup>
    import {onBeforeUnmount, ref, shallowRef, onMounted,reactive} from 'vue'
    import {useRoute,useRouter} from 'vue-router'
 
    import { ElMessage, ElMessageBox ,UploadProps, UploadUserFile} from 'element-plus'

    //获取路由参数
    const route = useRoute()
    //路由跳转
    const router = useRouter()

    //定时器数组
    const dsq = reactive({
      data:[]
    })

    onMounted(()=>{
      console.log('完成')

      //循环列表数据
      for(var x = 0;x<tableData.data.length;x++){
        console.log(tableData.data[x].starttime)
        var t = setInterval((x)=>{
          // vue3是响应式数据,废除了$set方法
          tableData.data[x].startnow = getTime(alldifftype(tableData.data[x].starttime))
          tableData.data[x].endnow = getTime(alldifftype(tableData.data[x].endtime))
        },1000,x)
        dsq.data.push(t)
      }
    
    })

    onBeforeUnmount(()=>{
      console.log('销毁')
      console.log(dsq.data)
      for(var x = 0;x<dsq.data.length;x++){
        clearInterval(dsq.data[x])
      }
      dsq.data = []
      console.log(dsq.data)
    })

    //模拟数据
    const tableData = reactive({
      data:[
        {
          'starttime':'2024-04-07 16:00:00',
          'endtime':'2024-04-08 12:00:00',
        },
        {
          'starttime':'2024-04-01 12:00:00',
          'endtime':'2025-04-08 12:00:00',
        }
      ]
    })

   
    //跳转到其他页面
    const tootherpage = ()=>{
      router.push({path:'/fuwenben'})
    }
    
    //相差时间
    const alldifftype = (time)=>{
      let startTime = new Date(time); // 开始时间
      let endTime = new Date(); // 结束时间
      // console.log(endTime - startTime)



      //通过Math.abs绝对值,无需判断日期谁大谁小,实现从倒计时到正计时无缝切换
      var ss = Math.abs(Math.floor((endTime - startTime) / 1000))
      var mm = Math.abs(Math.floor((endTime - startTime) / 1000 / 60))
      var hh = Math.abs(Math.floor((endTime - startTime) / 1000 / 60 / 60))
      var dd = Math.abs(Math.floor((endTime - startTime) / 1000 / 60 / 60 / 24))
 
      // console.log(ss); // 秒数
      // console.log(mm); // 分钟
      // console.log(hh); // 小时
      // console.log(dd); // 天数
      
 
      return ss
    }

    // 秒转时分秒
    const getTime = (value)=> {
     
      let secondTime = parseInt(value); // 秒
      let minuteTime = 0; // 分
      let hourTime = 0; // 时
      if (secondTime > 60) {
        //如果秒数大于60,将秒数转换成整数
        //获取分钟,除以60取整,得到整数分钟
        minuteTime = parseInt(secondTime / 60);
        //获取秒数,秒数取余,得到整数秒数
        secondTime = parseInt(secondTime % 60);
        //如果分钟大于60,将分钟转换成小时
        if (minuteTime > 60) {
          //获取小时,获取分钟除以60,得到整数小时
          hourTime = parseInt(minuteTime / 60);
          //获取小时后取余的分,获取分钟除以60取余的分
          minuteTime = parseInt(minuteTime % 60);
        }
      }
      //若秒数是个位数,前面用0补齐
      secondTime = secondTime < 10 ? "0" + secondTime : secondTime;
      var result = "" + secondTime + "";
      if (minuteTime > 0) {
        //若分钟数是个位数,前面用0补齐
        minuteTime = minuteTime < 10 ? "0" + minuteTime : minuteTime;
        result = "" + minuteTime + ":" + result;
      } else {
        //若分钟数为0,用"00"表示
        result = "" + "00" + ":" + result;
      }
    
      if (hourTime > 0) {
        //若小时数是个位数,前面用0补齐
        hourTime = hourTime < 10 ? "0" + hourTime : hourTime;
        result = "" + hourTime + ":" + result;
      } else {
        //若小时数为0,用"00"表示
        result = "" + "00" + ":" + result;
      }
     
      return result;
    }

    
   
</script>

<style scoped>

</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T-小丑

需要什么demo可以留言

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值