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

uni-app倒计时公共组件 封装,倒计时组件

1. uni-app倒计时公共组件 封装,倒计时组件

1.1. 思路

  uni-app倒计时公共组件封装有使用vue文件封装和使用工厂函数设置props的默认值两种方法。
(1)使用vue文件封装
可以使用vue文件来封装倒计时组件。这个组件应该是一个负责展示的零件,展示的数据就是父组件要传递的prop,包括提示文字和左边的读秒。组件需要保持在左上角显示,所以根组件需要fixed固定定位。另外,组件在倒计时完毕后要隐藏掉,所以组件是否显示出来也应该由父组件控制。圆形的进度应该不只是倒计时读秒,弧度应该由百分比决定,所以要知道总时长百分比才可以1。
(2)使用工厂函数设置props的默认值
可以使用工厂函数来设置props的默认值。倒计时组件的核心功能是将服务器返回的时间戳转换为用户友好的时间格式,并实时更新显示剩余时间。时间戳是自1970年1月1日以来的秒数,通常由后台服务提供。在前端,我们需要将这个数字转换为年、月、日、小时。

1.2. 倒计时代码

在这里插入图片描述

<template><view><view class="count-timer">{{ testTimeStr }}后自动结束考试</view></view>
</template>
<script>
import CountDown from "../../../components/count-down.vue";
export default {components: {CountDown},data() {return {testTimeStr: "0分0秒",expire_time:'2025-10-11 23:23:23'}},onLoad() {let leftTimeStamp = 20 * 60 * 1000this.startCountdown(leftTimeStamp);},methods: {startCountdown(leftTimeStamp) {let that = this;let countMinute = 0;let countSecond = 0;// 获取当前时间const nowDate = new Date();// 定义结束时间为1小时后const endDate = new Date(nowDate.getTime() + leftTimeStamp);//// 距离结束时间的毫秒数//const leftTimeStamp = endDate.getTime() - nowDate.getTime();// 计算分钟数const leftMinute = Math.floor(leftTimeStamp / (1000 * 60)) % 60;// 计算秒数const leftSecond = Math.floor(leftTimeStamp / 1000) % 60;// 返回倒计时的分钟数countMinute = leftMinute;// 返回倒计时的秒数countSecond = leftSecond;const timer = setInterval(() => {// 获取当前时间const now = new Date();// 距离结束时间的毫秒数const left = endDate.getTime() - now.getTime();// 计算分钟数const minute = Math.floor(left / (1000 * 60)) % 60;// 计算秒数const second = Math.floor(left / 1000) % 60;// 更新倒计时的分钟数countMinute = minute;// 更新倒计时的秒数countSecond = second;// 倒计时结束if (left < 0) {// 清除定时器clearInterval(timer);// 显示00:00countMinute = countSecond = 0;}that.testTimeStr = countMinute + "分" + countSecond + "秒"}, 1000);},}
}
</script>
<style>
</style>

1.3. 倒计时组件封装

在这里插入图片描述

  (1)count-down.vue倒计时组件

<!--公共组件内容-->
<template><view class="time" :style="justifyLeft"><text class="red" v-if="tipText">{{ tipText }}</text><text class="styleAll" :style="'background-color:'+ bgColor +';color:'+ colors +';'" v-if="isDay === true">{{ day }}</text><text class="timeTxt red" v-if="dayText">{{ dayText }}</text><text class="styleAll square" :style="'background-color:'+ bgColor +';color:'+ colors +';'">{{ hour }}</text><text class="timeTxt red  " v-if="hourText">{{ hourText }}</text><text class="styleAll square" :style="'background-color:'+ bgColor +';color:'+ colors +';'">{{ minute }}</text><text class="timeTxt red " v-if="minuteText">{{ minuteText }}</text><text class="styleAll square" :style="'background-color:'+ bgColor +';color:'+ colors +';'">{{ second }}</text><text class="timeTxt red  " v-if="secondText">{{ secondText }}</text><text>支付关闭</text></view>
</template>
<script>
export default {name: "countDown",props: {justifyLeft: {type: String,default: ""},//距离开始提示文字tipText: {type: String,default: "剩"},dayText: {type: String,default: " "},hourText: {type: String,default: "时"},minuteText: {type: String,default: "分"},secondText: {type: String,default: "秒"},datatime: {type: Number,default: 0},isDay: {type: Boolean,default: false},bgColor:{type: String,default: ""},colors:{type: String,default: ""}},data: function() {return {day: "00",hour: "00",minute: "00",second: "00"};},created: function() {this.show_time();},mounted: function() {},methods: {show_time: function() {let that = this;function runTime() {//时间函数let intDiff = that.datatime - Date.parse(new Date()) / 1000; //获取数据中的时间戳的时间差;let day = 0,hour = 0,minute = 0,second = 0;if (intDiff > 0) {//转换时间if (that.isDay === true) {day = Math.floor(intDiff / (60 * 60 * 24));} else {day = 0;}hour = Math.floor(intDiff / (60 * 60)) - day * 24;minute = Math.floor(intDiff / 60) - day * 24 * 60 - hour * 60;second =Math.floor(intDiff) -day * 24 * 60 * 60 -hour * 60 * 60 -minute * 60;if (hour <= 9) hour = "0" + hour;if (minute <= 9) minute = "0" + minute;if (second <= 9) second = "0" + second;that.day = day;that.hour = hour;that.minute = minute;that.second = second;} else {that.day = "00";that.hour = "00";that.minute = "00";that.second = "00";}}runTime();setInterval(runTime, 1000);}}
};
</script>
<style>
.time{display: flex;justify-content: center;
}
.red{color: var(--view-theme);margin: 0 4rpx;
}
.square{width: 40rpx;height: 40rpx;background: #FFFFFF;border-radius: 8rpx;display: inline-block;vertical-align: middle;margin: 0 10rpx;color: #FF3255;font-size: 24rpx;
}
</style>

  (2)使用

<template><view><view class="count-timer">{{ testTimeStr }}后自动结束考试</view><!-- 通常调用公共组件的顺序 1.引入  2.注册 3.调用--><countDown :datatime='expire_time':isDay='false'hourText=':'minuteText=':'secondText=''></countDown></view>
</template><script>
import CountDown from "../../../components/count-down.vue";
export default {components: {CountDown},data() {return {testTimeStr: "0分0秒",expire_time:'2025-10-11 23:23:23'}},onLoad() {let leftTimeStamp = 20 * 60 * 1000this.startCountdown(leftTimeStamp);this.expire_time = new Date().getTime()/1000+14285;},methods: {startCountdown(leftTimeStamp) {let that = this;let countMinute = 0;let countSecond = 0;// 获取当前时间const nowDate = new Date();// 定义结束时间为1小时后const endDate = new Date(nowDate.getTime() + leftTimeStamp);//// 距离结束时间的毫秒数//const leftTimeStamp = endDate.getTime() - nowDate.getTime();// 计算分钟数const leftMinute = Math.floor(leftTimeStamp / (1000 * 60)) % 60;// 计算秒数const leftSecond = Math.floor(leftTimeStamp / 1000) % 60;// 返回倒计时的分钟数countMinute = leftMinute;// 返回倒计时的秒数countSecond = leftSecond;const timer = setInterval(() => {// 获取当前时间const now = new Date();// 距离结束时间的毫秒数const left = endDate.getTime() - now.getTime();// 计算分钟数const minute = Math.floor(left / (1000 * 60)) % 60;// 计算秒数const second = Math.floor(left / 1000) % 60;// 更新倒计时的分钟数countMinute = minute;// 更新倒计时的秒数countSecond = second;// 倒计时结束if (left < 0) {// 清除定时器clearInterval(timer);// 显示00:00countMinute = countSecond = 0;}that.testTimeStr = countMinute + "分" + countSecond + "秒"}, 1000);},}
}
</script>
<style>
</style>

文章转载自:

http://0FUgxgPr.ykrkb.cn
http://LM4n3hFa.ykrkb.cn
http://7hhSd8DI.ykrkb.cn
http://xwkDpJST.ykrkb.cn
http://QaOuZExN.ykrkb.cn
http://fiWIdEcx.ykrkb.cn
http://Hsw6UUmt.ykrkb.cn
http://06rXtoqL.ykrkb.cn
http://i537RGpK.ykrkb.cn
http://kVuEJ0Ed.ykrkb.cn
http://KmVeZqpt.ykrkb.cn
http://DkkacHJs.ykrkb.cn
http://pV6hN3f4.ykrkb.cn
http://ji0O0gTC.ykrkb.cn
http://L6aKndMK.ykrkb.cn
http://cdHk5HoJ.ykrkb.cn
http://ZTacgxyF.ykrkb.cn
http://UthR0AjE.ykrkb.cn
http://gDC9G0Wo.ykrkb.cn
http://JIPg820Z.ykrkb.cn
http://wkoszt0d.ykrkb.cn
http://38jQXXjn.ykrkb.cn
http://VfbX0pUa.ykrkb.cn
http://QXVrfaUZ.ykrkb.cn
http://2DcQ3s7O.ykrkb.cn
http://A2cRuSE5.ykrkb.cn
http://62NMjWeh.ykrkb.cn
http://mWLkogfk.ykrkb.cn
http://MxpVQLjo.ykrkb.cn
http://1zMv6WhZ.ykrkb.cn
http://www.dtcms.com/a/369954.html

相关文章:

  • AI驱动的软件测试:革命性的自动化、缺陷检测与实验优化
  • 打包 Uniapp
  • Vue 项目性能优化实战
  • C++ Lambda 表达式完整指南
  • PlantSimulation 在汽车总装车间配送物流仿真中的应用
  • 浅谈前端框架
  • 深蓝汽车人事调整:邓承浩升任董事长,姜海荣出任首席执行官
  • github上传步骤
  • 详解flink性能优化
  • 在 ES6 中如何提取深度嵌套的对象中的指定属性
  • MySQL数据库——3.2.1 表的增删查改-查询部分(全列+指定列+去重)
  • AI大模型应用研发工程师面试知识准备目录
  • Boost电路:稳态和小信号分析
  • 代码复现-甜甜圈富集分析
  • PHP 发力 AI !PHP 官方 MCP SDK 正式发布
  • 从0死磕全栈第五天:React 使用zustand实现To-Do List项目
  • 从0死磕全栈第3天:React useState 实战,用 TS 手搓一个注册表单
  • MacOS 使用 luarocks+wrk+luajit
  • Rust在医疗系统中的应用:安全、性能与合规性实践(上)
  • 《云原生微服务治理进阶:隐性风险根除与全链路能力构建》
  • 006-Dephi 表达式 选择语句 循环语句其他语句
  • 深度学习:残差网络ResNet与迁移学习
  • SQL 实战指南:校园图书管理系统 SQL 设计(借阅 / 归还 / 库存查询实现)——超全项目实战练习
  • 输入2.2V~16V 最高输出20V2.5A DCDC升压芯片MT3608L
  • 人工智能学习:什么是seq2seq模型
  • 【基础-单选】singleton模式下首次进入的执行顺序是
  • 基于YOLO8的汽车碰撞事故检测系统【数据集+源码+文章】
  • 【c++进阶系列】:万字详解AVL树(附源码实现)
  • 【设计模式】 工厂方法模式
  • 总结-遇到