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
})
},
注意:定时器加入之后如果把定义在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
})
}
}