uniapp 实现时分秒 分别倒计时

发布于:2025-05-02 ⋅ 阅读:(11) ⋅ 点赞:(0)

效果

<view class="issue-price-countdown">
         <CountDown :endTimestamp="1745996085000"></CountDown>
 </view>

引入组件

import CountDown from '@/components/CountDown.vue';

<template>
    <view class="countdown">
        <view class="time-box hour">{{ currentHours }}</view>
        <text class="colon">:</text>
        <view class="time-box minute">{{ currentMinutes }}</view>
        <text class="colon">:</text>
        <view class="time-box second">{{ currentSeconds }}</view>
    </view>
</template>

<script>
    export default {
        props: {
            // 接收13位时间戳(结束时间)
            endTimestamp: {
                type: Number,
                required: true
            }
        },
        data() {
            return {
                remainingTime: 0,  // 剩余总秒数
                timer: null,
                currentHours: 0,
                currentMinutes: 0,
                currentSeconds: 0
            }
        },
        methods: {
          // 初始化倒计时
            initCountdown() {
                this.clearTimer()
                this.calculateRemaining()
                
                if (this.remainingTime > 0) {
                    this.timer = setInterval(() => {
                        this.updateTime()
                    }, 1000)
                }
            },
            // 计算剩余时间
            calculateRemaining() {
                const now = Date.now()
                this.remainingTime = Math.max(0, Math.floor((this.endTimestamp - now) / 1000))
                this.updateDisplayTime()
            },
            
            // 更新时间显示
            updateDisplayTime() {
                let seconds = this.remainingTime % 60
                let minutes = Math.floor(this.remainingTime / 60) % 60
                const hours = Math.floor(this.remainingTime / 3600)
    
                // 实现级联更新效果
                if (this.currentSeconds === 0 && seconds === 59) {
                    this.currentMinutes = minutes
                }
                if (this.currentMinutes === 0 && minutes === 59) {
                    this.currentHours = hours
                }
    
                this.currentSeconds = this.pad(seconds)
                this.currentMinutes = this.pad(minutes)
                this.currentHours = this.pad(hours)
            },
            // 每秒更新
            updateTime() {
                this.remainingTime = Math.max(0, this.remainingTime - 1)
                this.updateDisplayTime()
    
                if (this.remainingTime <= 0) {
                    this.clearTimer()
                    this.$emit('timeup')
                }
            },
            
            // 补零函数
            pad(n) {
                return n < 10 ? '0' + n : n
            },
            
            // 清除定时器
            clearTimer() {
                if (this.timer) {
                    clearInterval(this.timer)
                    this.timer = null
                }
            }
        },
        watch: {
            endTimestamp: {
                immediate: true,
                handler(newVal) {
                    this.initCountdown()
                }
            }
        },
        created() {
          
        }
    }
</script>

<style lang="scss" scoped>
    .countdown {
        display: flex;
        align-items: center;
        justify-content: space-between;
        .time-box {
            width: 52rpx;
            height: 52rpx;
            background: #313131;
            line-height: 52rpx;
            text-align: center;
            border-radius: 10rpx 10rpx 10rpx 10rpx;
            font-weight: bold;
        }
        .colon {
            color: #313131;
            margin: 0 12rpx;
        }
    }
</style>


网站公告

今日签到

点亮在社区的每一天
去签到