Vue3倒计时组件(Countdown)

news2024/9/20 18:54:51

可自定义设置以下属性:

  • 倒计时数值(countdown),单位s,必传
  • 倒计时标题(title),默认'Countdown',string | v-slot
  • 格式化倒计时展示(format),默认'HH:mm:ss',(D:天,H:小时,m:分钟,s:秒)
  • 倒计时数值的前缀(prefix),默认'',string | v-slot
  • 倒计时数值的后缀(suffix),默认'',string | v-slot
  • 完成后的展示文本(finishedText),默认'',string | v-slot

效果如下图:

  • format:HH:mm:ss

  • format: D 天 H 时 m 分 s 秒

  •  finished:

①创建倒计时组件Countdown.vue:

<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import type { Ref } from 'vue'
interface Props {
  countdown: number, // 倒计时数值,单位s
  title?: string, // 倒计时标题 string | v-slot
  format?: string, // 格式化倒计时展示,(D:天,H:小时,m:分钟,s:秒)
  prefix?: string, // 倒计时数值的前缀 string | v-slot
  suffix?: string, // 倒计时数值的后缀 string | v-slot
  finishedText?: string // 完成后的展示文本 string | v-slot
}
const props = withDefaults(defineProps<Props>(), {
  countdown: 0,
  title: 'Countdown',
  format: 'HH:mm:ss',
  prefix: '',
  suffix: '',
  finishedText: ''
})
const restTime = ref(props.countdown)
function fixedTwo (value: number): string {
  return value < 10 ? '0' + value : String(value)
} 
function timeFormat (time: number): string {
  let showTime = props.format
  if (showTime.includes('s')) {
    var s = time
  } else {
    var s = 0
  }
  if (showTime.includes('m')) {
    s = s % 60
    var m = Math.floor((time - s) / 60)
  } else {
    var m = 0
  }
  if (showTime.includes('H')) {
    m = m % 60
    var h = Math.floor((time - s - m * 60) / 60 / 60)
  } else {
    var h = 0
  }
  if (showTime.includes('D')) {
    h = h % 24
    var d = Math.floor((time - s - m * 60 - h * 60 * 60) / 60 / 60 / 24)
  } else {
    var d = 0
  }
  showTime = showTime.includes('ss') ? showTime.replace('ss', fixedTwo(s)) : showTime.replace('s', String(s))
  showTime = showTime.includes('mm') ? showTime.replace('mm', fixedTwo(m)) : showTime.replace('m', String(m))
  showTime = showTime.includes('HH') ? showTime.replace('HH', fixedTwo(h)) : showTime.replace('H', String(h))
  showTime = showTime.includes('DD') ? showTime.replace('DD', fixedTwo(d)) : showTime.replace('D', String(d))
  return showTime
}
const showTime = computed(() => { // 展示的倒计时
  return timeFormat(restTime.value)
})
const emit = defineEmits(['finish'])
function CountDown (restTime: Ref):void {
  setTimeout(() => {
    restTime.value--
    if (restTime.value > 0) { // js中Boolean(非0)都是true
      CountDown(restTime)
    } else {
      emit('finish')
    }
  }, 1000)
}
onMounted(() => {
  CountDown(restTime)
})
</script>
<template>
  <div class="m-countdown">
    <slot name="title">
      <p class="u-title">{{ props.title }}</p>
    </slot>
    <div class="u-time">
      <slot name="prefix">{{ prefix }}</slot>
      <slot v-if="finishedText&&restTime===0" name="finish">{{ finishedText }}</slot>
      <span v-else>{{ showTime }}</span>
      <slot name="suffix">{{ suffix }}</slot>
    </div>
  </div>
</template>
<style lang="less" scoped>
.m-countdown {
  display: inline-block;
  .u-title {
    margin-bottom: 4px;
    color: #00000073;
    font-size: 14px;
  }
  .u-time {
    color: #000000d9;
    font-size: 24px;
    line-height: 1.5;
  }
}
</style>

②在要使用的页面引入:

<script setup lang="ts">
import Countdown from './Countdown.vue'

function onFinish () {
  console.log('countdown finished')
}
</script>
<template>
  <Countdown
    title="Countdown"
    :countdown="3"
    format="D 天 H 时 m 分 s 秒"
    finishedText="Finished"
    @finish="onFinish">
    <template #prefix>There's only </template>
    <!-- <template #finish>&lt; FinishedText slot &gt;</template> -->
    <template #suffix> left for the end.</template>
  </CountDown>
</template>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“操作无法完成,因为其中的文件或文件夹一再另一程序打开”解决方法

windows系统中&#xff0c;有时时候我们想要修改某个文件&#xff0c;就出现出现如下提示&#xff1a;操作无法完成&#xff0c;因为其中的文件或文件夹已在另一程序打开请关闭该文件或文件夹&#xff0c;然后重试出现这个上面提示的原因是&#xff0c;我们要修改的文件或文件夹…

网络基础(1)

目录1. 网络1.1 网络是什么1.2 网络在哪里2. 协议3. TCP/IP五层(或四层)模型3.1 分层细节3.2 报头3.2.1 封装与解包4. 数据传输4.1 局域网4.2 IP地址与Mac地址1. 网络 1.1 网络是什么 网络本质是一个软件&#xff0c;软件是可以进行分层的。例如STL库&#xff0c;实际上分为了…

文件包含漏洞1 | iwebsec

文章目录00-文件包含漏洞原理环境01-本地文件包含读取敏感文件信息配合文件上传getshell配合日志文件getshell配合SSH日志配合运行环境00-文件包含漏洞原理 为什么要文件包含&#xff1f; 为什么会有文件包含漏洞? 因为将被包含的文件设置为变量&#xff0c;用来进行动态调用…

169_技巧_Power BI 依据促销日历计算销售金额

169_技巧_Power BI 依据促销日历计算销售金额 一、背景 在各位表格表姐们计算销售金额的时候&#xff0c;有一个绕不开的问题&#xff1a;商品有促销的问题&#xff0c;需要使用对应的促销价来计算销售额。 按照惯例还是先来看看结果 Power BI 公共 web 效果&#xff1a;htt…

使用docker进行Mongoyapi安装,Mongo重启yapi重启

在这里我使用Linux虚拟机作为docker服务器&#xff0c;本机通过xshell进行远程操作。 Mongo安装&#xff1a;docker run -d --name mongo-yapi mongo; yapi安装&#xff1a;1&#xff09;拉取yapi docker pull registry.cn-hangzhou.aliyuncs.com/anoy/yapi 2&#xff09;初…

2023款欧拉好猫上市,12.98万起

上周&#xff0c;2023款欧拉好猫焕新上市。2023款好猫共推出5个车型&#xff1a; •401km标续航&#xff0c;舒享型/豪华型/尊贵型&#xff0c;分别是12.98/13.98/14.98万元&#xff1b; •501km长续航&#xff0c;豪华型/尊贵型&#xff0c;分别是15.58/16.58万元&#xff1b;…

00后整顿职场,当摸鱼测试员遇上了内卷00后。

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

【PaddleOCR-kie】一、关键信息抽取:使用VI-LayoutXLM模型推理预测(SER+RE)

背景&#xff1a;在训练自己数据集进行kie之前&#xff0c;想跑一下md里面的例程&#xff0c;但md教程内容混乱&#xff0c;而且同一个内容有多个手册&#xff0c;毕竟是多人合作的项目&#xff0c;可能是为了工程解耦&#xff0c;方便更新考虑……需要运行的模型和运行步骤散落…

没有钱怎么创业?一分钱没有如何能创业成功?

限制人创业成功的从来都不是资金&#xff0c;而是能力&#xff0c;这个道理很多人都可能不懂&#xff0c;多数人习惯了庸庸碌碌、日复一日地打工行为&#xff0c;却不知如何创业&#xff0c;那么&#xff0c;没有钱怎么创业&#xff1f;一分钱没有如何能创业成功呢&#xff1f;…

【深度学习】预训练语言模型-BERT

1.BERT简介 BERT是一种预训练语言模型&#xff08;pre-trained language model, PLM&#xff09;&#xff0c;其全称是Bidirectional Encoder Representations from Transformers。下面从语言模型和预训练开始展开对预训练语言模型BERT的介绍。 1-1 语言模型 语言模型 &#xf…

iOS(一):Swift纯代码模式iOS开发入门教程

Swift纯代码模式iOS开发入门教程项目初始化&#xff08;修改为纯代码项目&#xff09;安装第三方库&#xff08;以SnapKit库为例&#xff09;桥接OC库&#xff08;QMUIKit&#xff09;封装视图并进行导航跳转示例&#xff1a;使用 TangramKit 第三方UI布局库应用国际化添加 R.s…

NICEGUI---ROS开发之中常用的GUI工具

0. 简介 对于ROS来说&#xff0c;如果不具备一定知识的人员来使用这些我们写的算法&#xff0c;如果说没有交互&#xff0c;这会让用户使用困难&#xff0c;所以我们需要使用GUI来完成友善的数据交互&#xff0c;传统的GUI方法一般有PYQT这类GUI方法&#xff0c;但是这类GUI工…

激光炸弹(前缀和)

地图上有 N 个目标&#xff0c;用整数 Xi,Yi 表示目标在地图上的位置&#xff0c;每个目标都有一个价值 Wi。注意&#xff1a;不同目标可能在同一位置。现在有一种新型的激光炸弹&#xff0c;可以摧毁一个包含 RR 个位置的正方形内的所有目标。激光炸弹的投放是通过卫星定位的&…

顺序表以及链表的应用及区别(包含OJ讲解)

前面我已经发过怎么实现链表以及顺序表&#xff0c;今天大概的总结一下。 顺序表&#xff1a; 1.能够随时的存取&#xff0c;比较方便。 2.插入删除时&#xff0c;需要挪动数据&#xff0c;比较麻烦&#xff0c;因为是连续存储。 3.存储密度相对于链表来说是比较高的&#…

C++类的组合

C类的组合什么是类的组合初始化参数列表使用类的组合案例分析组合构造和析构顺序问题this指针基本用法和作用什么是类的组合 类的组合就是以另一个对象为数据成员&#xff0c;这种情况称为类的组合 1.优先使用类的组合&#xff0c;而不是继承 2.组合表达式的含义 一部分关系 初…

用户登录请求100w/每天, JVM如何调优

用户登录请求100w/每天, JVM如何调优 大概可以分为以下8个步骤。 Step1&#xff1a;新系统上线如何规划容量&#xff1f; 1.套路总结 任何新的业务系统在上线以前都需要去估算服务器配置和JVM的内存参数&#xff0c;这个容量与资源规划并不仅仅是系统架构师的随意估算的&am…

springboot启动过程加载数据笔记(springboot3)

SpringApplication AbstractApplicationContext PostProcessorRegistrationDelegate ConfigurationClassPostProcessor ConfigurationClassParser 一堆循环和调用 ComponentScanAnnotationParser扫描 processConfigurationClass.doProcessConfigurationClass(configClass, so…

网络编程(二)

6. TCP 三次握手四次挥手 HTTP 协议是 Hype Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写&#xff0c;是用于从万维网&#xff08;WWW&#xff1a;World Wide Web&#xff09;服务器&#xff08;sever&#xff09;传输超文本到客户端&#xff08;本地浏览器…

小众但意外觉得蛮好用的剪辑软件!纯良心分享

爱剪辑 有开屏广告&#xff0c;一共3个界面&#xff1a;首页、剪同款、我的。 剪辑、配乐、字幕、滤镜、加速、贴纸、配音等主流功能都有。 特色功能有剪裁视频、倒放视频、视频旋转、视频转换GIF、转场、提取音频、画中画等。 还可以拼接视频&#xff0c;不过不支持FLV等小众文…

人员摔倒识别预警系统 人员跌倒检测算法 yolov7

人员摔倒识别预警系统 人员跌倒检测算法基于yolov7网络模型计算机识别技术&#xff0c;人员摔倒识别预警系统 人员跌倒检测算法对画面中人员摔倒进行实时检测识别抓拍告警。YOLOv7 的策略是使用组卷积来扩展计算块的通道和基数。研究者将对计算层的所有计算块应用相同的组参数和…