테이블에 카운트다운 추가(서버 시간 카운트다운)/타이머 지우는 방법

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){
       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秒'){
          clearInterval(row.countDown)
          timer = null
          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;//当前时间日期矫正
      this.$once('hook:beforeDestroy', () => {
        clearInterval(row.countDown)
        row.countDown = null
      })
    },

 

참고: 타이머가 추가된 후 데이터에 타이머가 정의되어 있으면 전환 중 beforeDestroy에서 지우기 기능을 실행하여 타이머를 전혀 지울 수 없습니다. (특수한 경우에는 대상 정의를 포함하여 일반적인 상황에서는 지울 수 있습니다.) 이것이 가장 좋은 방법입니다. 데이터에 정의하지 마십시오. 후크를 사용하여 beforeDestroy 라이프 사이클을 모니터링하십시오. 이렇게 하면 라이프 사이클에서만 타이머를 정의하면 위의 모든 문제가 해결됩니다.

팁: 데이터가 변경된 후에도 테이블이 변경되지 않으면 테이블에 대한 키를 정의하십시오. 키 값은 this.itemKey=Math.random()과 같이 임의의 숫자일 수 있습니다. (참고: 다음과 같은 경우에는 사용하지 마십시오. 타이머가 있으면 버그가 있을 수 있습니다.)

지울 수 없는 타이머를 작성하는 방법: 
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
    })
  }
}

추천

출처blog.csdn.net/qq_36821274/article/details/131435791