table里面加入倒计时(服务器时间进行倒计时)/清理定时器不了的方法

1、需求(需要拿到服务器时间与开始时间做比较,然后根据定时器来实时更新数据)

 代码:

 <el-table :data="querylist" border stripe class="mt20 table-mainbg" :key="itemKey">
    <el-table-column prop="affRegion" label="所属区域" align="center"></el-table-column>
    <el-table-column prop="carNo" label="车牌号码" align="center"></el-table-column>
    <el-table-column prop="productYear" label="年份/车型" align="center"></el-table-column>
    <el-table-column prop="carGradeResult" label="车辆评级" align="center"></el-table-column>
    <el-table-column prop="carAuditFinishTime" label="审核通过时间" align="center"></el-table-column>
    <el-table-column prop="auctionBeginTime" label="竞拍开始时间" align="center"></el-table-column>
    <el-table-column prop="auctionSeatBeginTime" label="场次开始时间" align="center"></el-table-column>
    <el-table-column prop="intervalTime" label="倒计时" align="center">
    </el-table-column>
</el-table>
created(){
 this.init()
},
init(){
 this.$api.postCarPage().then(res=>{
   if(res.code==0){
        //清除存储的定时器
        for(let i=0;i<this.timerArr.length;i++){
          clearInterval(this.timerArr[i])
        }
       this.timerArr=[];//数据重置
       let arr=res.data;
       for(let i=0;i<arr.length;i++){
         arr[i].intervalTime='';
         this.countDown(arr[i])
       }
       this.querylist=arr;
    }
  }
},
countDown(row){
      if(!row.auctionBeginTime){
        return
      }
      row.countDown=setInterval(() => {
        if(isNaN(row.nowTime)==false){
          row.nowTime =row.nowTime +1000;
          row.nowDate=new Date(row.nowTime)
        }
        row.intervalTime =  this.$$.formatSeconds(new Date(row.auctionBeginTime)- new Date(row.nowTime) );
        if(row.intervalTime=='0天0小时0分钟0秒'){
          setTimeout(()=>{
            this.init();
          },1000*3)
        }
      }, 1000); //这边采取的是1秒调用一次
      //这里采用简单写法,直接在查询的时候调用一次,不用等定时器调用
      row.intervalTime =  this.$$.formatSeconds(new Date(row.auctionBeginTime)- new Date(row.now));
      row.nowTime = new Date(row.now).getTime()//服务器时间更新
      row.nowDate = row.now;//当前时间日期矫正
      if(row.countDown){//这个地方需要把定时器id存起来,好在下次触发调用接口的时候进行清除定时器,不然就会生成很多定时器
        this.timerArr.push(row.countDown)
      }
      this.$once('hook:beforeDestroy', () => {
        clearInterval(row.countDown)
        row.countDown = null
      })
    },

注意:定时器加入之后如果把定义在data里面,在切换时在beforeDestroy里面执行清除定时器根本清除不掉(针对特殊情况,普通情况是可以清除的,包括针对性的定义),最好的方法是不要定义在data里面,这里使用 hook 监听 beforeDestroy 生命周期,这样 timer 只需被定义在生命周期里,以上的问题就全部解决了。

提示:如果数据变了table没有变化的话,给tabe定义一个key,key值可以是一个随机数,如:this.itemKey=Math.random(),(注意:不要用在定时器当中,会有bug)

注意:每在定时器中调用一次接口就会生成一个新的定时器,这个时候需要把旧的定时器给清理掉,不然调用接口的次数会叠加

清理不掉定时器的写法: 
export default {
  data() {
    return {
    }
  },
  
  mounted() {
    let timer = setInterval(() => {
      console.log('setInterval')
    }, 1000)
    this.$once('hook:beforeDestroy', () => {
      clearInterval(timer)
      timer = null
    })
  }
}

如果加入了加了 keep-alive 缓存时的写法

export default {
  data() {
    return {
    }
  },
  mounted() {
    let timer = setInterval(() => {
      console.log('setInterval')
    }, 1000)
    this.$on('hook:activated', () => {
      if (timer === null) { // 避免重复开启定时器
        timer = setInterval(() => {
          console.log('setInterval')
        }, 1000)
      }
    })
    this.$on('hook:deactivated', () => {
      clearInterval(timer)
      timer = null
    })
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值