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

时、分、秒、倒计时组件

封装一个待付款商品时分秒倒计时组件

父组件 导入使用

<view class="countert"><view class="pay"><view class="item"><view class="top"><view class="img"><img src="" alt="" /></view><view class="title"><view class="label">商品名称商品名称商品名称商品名称</view><view class="price">应付 <text class="t1">T 349.99</text></view></view><view class="obligation"><text class="ob1">待付款</text><text class="ob2">T349.99</text></view></view><view class="bottom"><view class="time"><view class="label">剩余</view> //主要代码<countdown :end-time="endTime" @finish="onCountdownFinish"/></view><view class="btnare"><view class="btn1">取消订单</view><view class="btn2" @click="goPay">去付款</view></view></view>	</view></view></view>
</template>
<script setup>import { ref, onMounted } from 'vue'import countdown from './countdown.vue'const endTime = ref(null)onMounted(async () => {// 模拟API调用// const res = await api.getEndTime()// endTime.value = res.data.endTime// 示例:设置一个未来的时间戳(当前时间+24小时)endTime.value = Math.floor(Date.now() / 1000) + 24 * 3600})const onCountdownFinish = () => {console.log('倒计时结束')// 可以在这里处理倒计时结束的逻辑// 比如刷新页面、提示用户等}const goPay = () => {uni.navigateTo({url: '/pages/pay/pay'})}
</script>

子组件(重要)直接复制粘贴使用

<!-- components/Countdown.vue -->
<template><view class="countdown"><text class="time-text">{{ formattedTime.hours }}</text><text class="separator">:</text><text class="time-text">{{ formattedTime.minutes }}</text><text class="separator">:</text><text class="time-text">{{ formattedTime.seconds }}</text></view></template><script setup>import { ref, computed, onMounted, onUnmounted, watch } from 'vue'// 定义propsconst props = defineProps({// 后端返回的时间戳(秒)endTime: {type: [Number, String],default: null},// 或者直接传入剩余秒数remainSeconds: {type: [Number, String],default: null}})// 定义事件const emit = defineEmits(['finish'])// 剩余秒数const remainingSeconds = ref(0)let timer = null// 计算格式化的时间const formattedTime = computed(() => {const totalSeconds = remainingSeconds.valueif (totalSeconds <= 0) {return {hours: '00',minutes: '00',seconds: '00'}}const hours = Math.floor(totalSeconds / 3600)const minutes = Math.floor((totalSeconds % 3600) / 60)const seconds = totalSeconds % 60return {hours: hours.toString().padStart(2, '0'),minutes: minutes.toString().padStart(2, '0'),seconds: seconds.toString().padStart(2, '0')}})// 初始化倒计时const initCountdown = () => {if (props.endTime) {// 基于结束时间戳计算const now = Math.floor(Date.now() / 1000)remainingSeconds.value = Math.max(0, props.endTime - now)} else if (props.remainSeconds !== null) {// 直接使用剩余秒数remainingSeconds.value = Math.max(0, parseInt(props.remainSeconds))}}// 开始倒计时const startCountdown = () => {// 清除之前的定时器if (timer) {clearInterval(timer)}initCountdown()// 如果剩余时间大于0,开始倒计时if (remainingSeconds.value > 0) {timer = setInterval(() => {remainingSeconds.value--if (remainingSeconds.value <= 0) {clearInterval(timer)timer = nullemit('finish')}}, 1000)}}// 重置倒计时const resetCountdown = () => {startCountdown()}// 监听props变化watch([() => props.endTime, () => props.remainSeconds], () => {startCountdown()})// 组件挂载时启动倒计时onMounted(() => {startCountdown()})// 组件销毁时清除定时器onUnmounted(() => {if (timer) {clearInterval(timer)}})// 暴露方法和属性defineExpose({resetCountdown,remainingSeconds})</script><style scoped>.countdown {display: flex;align-items: center;justify-content: center;}.time-text {font-family: PingFang SC, PingFang SC;font-weight: 400;font-size: 28rpx;  color: #212429;  padding: 0 2rpx;/* background-color: #f5f5f5;padding: 10rpx 15rpx;border-radius: 8rpx; */}.separator {font-size: 28rpx;font-weight: 500;color: #333333;margin: 0 10rpx;}</style>

效果图:
在这里插入图片描述

http://www.dtcms.com/a/337286.html

相关文章:

  • Redis 客户端安装方法
  • Spring Boot + Spring Kafka 集成
  • 深层语义知识图谱:提升NLP文本预处理效果的关键技术
  • 《基于改进 MobileNetV2 的轻量化茶叶病虫害检测方法》论文解析
  • Redis--day8--黑马点评--分布式锁(一)
  • HTML应用指南:利用POST请求获取全国华为旗舰店门店位置信息
  • Python函数:装饰器
  • c++最长上升子序列长度
  • 雷卯针对香橙派Orange Pi 5 Plus开发板防雷防静电方案
  • JavaWeb 请求与响应乱码问题全面解决方案
  • React diff——差异协调算法简介
  • 算法-决策树
  • 从决策树基础到熵与信息增益
  • 网络间的通用语言TCP/IP-网络中的通用规则1
  • 本地文件上传到gitee仓库的详细步骤
  • sem_post函数的定义及作用
  • 【81页PPT】国内某知名大型制药企业制药数字化转型项目汇报方案(附下载方式)
  • 无人设备遥控器之操控信号精度篇
  • 【68页PPT】MES系统数字化工厂解决方案(附下载方式)
  • 深入剖析以太坊虚拟机(EVM):区块链世界的计算引擎
  • go 多版本共存【goup + alias方案】
  • React diff Vue diff介绍
  • 【2025CVPR-目标检测方向】RaCFormer:通过基于查询的雷达-相机融合实现高质量的 3D 目标检测
  • 牛子图论进阶
  • TEST_
  • Linux系统启动原理及故障排除
  • 场外个股期权的行权日是t+多少个交易日?
  • 【牛客刷题】最大公约数与最小公倍数:算法详解与实现
  • linux中的hostpath卷与nfs卷以及静态持久卷的区别
  • JAiRouter 架构揭秘:一个面向 AI 时代的响应式网关设计