vue实现倒计时秒杀(多个倒计时)

data:{
    return{
          raidersData:[],
          interval: null, // 将interval定义为数据属性
          intervalMap: {}, // 存储定时器的map
          healthList:{},
    }
}


//离开页面清除  
beforeDestroy() {
    this.clearAllInterval(); // 清除所有定时器
},


    //-----倒计时 开始------
    async onlogding() {
      let that = this;
      let loading;
      try {
        loading = await this.$ionic.loadingController.create({
          message: '加载中..',
        });
        await loading.present();

        let id = this.$store.state.user.id
        const res = await this.$http.post(this.$partten.mbrUrl + '/SnatchTreasure/round', { id })

        // 清除旧的定时器
        this.clearAllInterval();
        if(res.body.length>0){
          res.body.forEach((item, index) => {
            if (item.startTime && item.endTime) {
              const startTime = moment(item.startTime).format('YYYY-MM-DD HH:mm:ss');
              const endTime = moment(item.endTime).format('YYYY-MM-DD HH:mm:ss');
              const nowTime = moment().format('YYYY-MM-DD HH:mm:ss');
              if (moment(nowTime).isBefore(startTime)) {
                item.state = 2; //待开始

                // 更新倒计时函数
                const updateCountdown = () => {
                  const nowTime = moment().format('YYYY-MM-DD HH:mm:ss'); //获取最新的当前时间
                  const duration = moment.duration(moment(startTime).diff(moment(nowTime))); // 剩余时间差
                  let hours = Math.floor(duration.asHours());
                  let minutes = duration.minutes();
                  let seconds = duration.seconds();
                  // 将小时、分钟和秒数格式化为两位数,并以 : 分隔
                  hours = ("0" + hours).slice(-2);
                  minutes = ("0" + minutes).slice(-2);
                  seconds = ("0" + seconds).slice(-2);

                  item.countdown = { hours, minutes, seconds };
                  // console.log(item.countdown,'222')

                  if (hours <= 0 && minutes <= 0 && seconds <= 0) {
                    clearInterval(that.intervalMap[index]); // 时间结束,停止倒计时
                    item.state = 1; //开始
                  } else {
                    duration.subtract(1, 's'); // 每秒减少1秒
                  }
                };
                updateCountdown();

                // 每秒调用一次更新倒计时函数
                that.intervalMap[index] = setInterval(updateCountdown, 1000);
              } else if (moment(nowTime).isAfter(endTime)) {
                item.state = 0; // 结束
              } else {
                item.state = 1; //进行中

                // 更新倒计时函数
                const updateCountdown = () => {
                  const nowTime = moment().format('YYYY-MM-DD HH:mm:ss'); //获取最新的当前时间
                  const duration = moment.duration(moment(endTime).diff(moment(nowTime))); // 剩余时间差

                  let hours = Math.floor(duration.asHours());
                  let minutes = duration.minutes();
                  let seconds = duration.seconds();

                  // 将小时、分钟和秒数格式化为两位数,并以 : 分隔
                  hours = ("0" + hours).slice(-2);
                  minutes = ("0" + minutes).slice(-2);
                  seconds = ("0" + seconds).slice(-2);

                  item.countdown = { hours, minutes, seconds };
                  // console.log(item.countdown,'111',item.state)
                  if (hours <= 0 && minutes <= 0 && seconds <= 0) {
                    clearInterval(that.intervalMap[index]); // 时间结束,停止倒计时
                    item.state = 0; //结束
                  } else {
                    duration.subtract(1, 's'); // 每秒减少1秒
                    // console.log( duration.subtract(1, 's'),' // 每秒减少1秒')
                  }
                };
                updateCountdown(); // 初始调用更新倒计时函数

                // 每秒调用一次更新倒计时函数
                that.intervalMap[index] = setInterval(updateCountdown, 1000);
              }
            } else {
              item.state = 0;
            }
          });
        }
        //-------倒计时结束-----------

        this.raidersData = res.body;
      } catch (err) {
        console.log('ERROR:' + err);
      } finally {
        if (loading) {
          loading.dismiss();
        }
      }
    },

    activated() {
      this.onloading();
    },
    clearAllInterval() {
      Object.values(this.intervalMap).forEach((intervalId) => {
        clearInterval(intervalId);
      });
      this.intervalMap = {};
    },
    //------倒计时 结束--------

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值