前端vue3 实现倒计时功能 组件

现在web端需要实现一个倒计时的组件 现在使用的是ant-design 组件 但是并没有关于倒计时的组件 现在手写一个 直接上代码

子组件

timer.vue

<template>
  <span class="countdown-cell" :class="{ 'text-danger': isExpired }">
    {{ displayText }}
  </span>
</template>

<script setup>
import { computed, ref, onMounted, onUnmounted } from 'vue';

const props = defineProps({
  endTime: {
    type: [Number, String, Date],
    required: true
  }
});

const emit = defineEmits(['expired']);

const now = ref(Date.now());
const isExpired = ref(false);

// 计算剩余时间(毫秒)
const remainingTime = computed(() => {
  const end = new Date(props.endTime).getTime();
  return end - now.value;
});

// 显示文本
const displayText = computed(() => {
  if (isExpired.value) return '已过期';
  
  const totalSeconds = Math.floor(remainingTime.value / 1000);
  if (totalSeconds <= 0) return '00:00:00';
  
  const hours = Math.floor(totalSeconds / 3600);
  const minutes = Math.floor((totalSeconds % 3600) / 60);
  const seconds = totalSeconds % 60;
  
  return [
    hours.toString().padStart(2, '0'),
    minutes.toString().padStart(2, '0'),
    seconds.toString().padStart(2, '0')
  ].join(':');
});

// 更新当前时间
let timer = null;
const updateNow = () => {
  now.value = Date.now();
  if (remainingTime.value <= 0 && !isExpired.value) {
    isExpired.value = true;
    emit('expired');
  }
};

onMounted(() => {
  updateNow();
  timer = setInterval(updateNow, 1000);
});

onUnmounted(() => {
  clearInterval(timer);
});
</script>

<style scoped>
.countdown-cell {
  font-family: monospace;
}
.text-danger {
  color: #f56c6c;
  font-weight: bold;
}
</style>

父组件中使用

   <CountdownTime
                  :end-time="getEndTime(record.createTime)"
                  @expired="handleExpired(record.id)"
    ></CountdownTime>

// 计算结束时间(创建时间 + 28分钟)
const getEndTime = (createTime: any) => {
  return new Date(Number(createTime) + 28 * 60 * 1000)
}

// 格式化日期
const formatDate = timestamp => {
  return new Date(timestamp).toLocaleString()
}

// 处理倒计时过期事件
const handleExpired = id => {
  console.log(`项目 ${id} 已过期`)
  // 可以在这里更新状态或执行其他操作
}

慢慢理解  直接用 就好了 传递 endTime 时间 比如 可以 使用创建时间 + 你想倒计时的时间

@expired 是倒计时结束的操作函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值