当前位置: 首页 > news >正文

前端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 是倒计时结束的操作函数

相关文章:

  • 重返JAVA之路——图书管理系统
  • B2B2C多用户商城平台 的两种创新玩法
  • 华熙生物亮相消博会,这次又带来了什么样的变化?
  • springboot项目添加定时任务,用sftp推送zip包到目标服务器
  • 车载信息安全 --- 密钥管理
  • Anaconda笔记
  • C语言-习题整理(1)
  • 第 2 篇:快速上手 Framer Motion(实操入门)
  • 烽火ai场控接入deepseek自动回复话术软件
  • 【Python】列表的创建:[[] for _ in range(2)] 与 [[]] * 2有什么区别?
  • STM32F407实现内部FLASH的读写功能
  • 【MySQL】MySQL数据库 —— 简单认识
  • 第3篇:深入 Framer Motion Variants:掌握组件动画编排的艺术
  • django项目之添加资产信息功能
  • YOLOv3模型架构与原理详解
  • Python 冷门魔术方法
  • Redis 高可用集群搭建与优化实践
  • 波束形成(BF)从算法仿真到工程源码实现-第十节-非线性波束形成
  • vue中使用swiper坑记录
  • 二、The Power of LLM Function Calling
  • 一季度全社会用电量同比增长2.5%,3月增速显著回升
  • 两部门通报18个破坏耕地、毁林毁草典型问题
  • 网约车司机要乘客提前200米下车遭殴打,警方介入
  • 习近平同柬埔寨首相洪玛奈举行会谈
  • 白宫称没接到中方电话,美媒:高估了关税对中国的影响力
  • 图解|回应期盼、可感可及!26项措施打开上海民营经济发展新天地