ivue-material-plus
Version:
A high quality UI components Library with Vue.js
1 lines • 5.05 kB
Source Map (JSON)
{"version":3,"file":"index2.mjs","sources":["../../../../../src/components/ivue-count-down/index.vue"],"sourcesContent":["<template>\r\n <span>\r\n <slot :countDown=\"countDownData\">{{ countDownData }}</slot>\r\n </span>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n defineComponent,\r\n reactive,\r\n onBeforeUnmount,\r\n onMounted,\r\n computed,\r\n watch,\r\n} from 'vue';\r\nimport { oneOf } from '../../utils/assist';\r\nimport { throwError } from '../../utils/error';\r\n\r\nimport { Props, Data } from './types/count-down';\r\n\r\nconst prefixCls = 'ivue-count-down';\r\n\r\nexport default defineComponent({\r\n name: prefixCls,\r\n emits: ['on-end'],\r\n props: {\r\n /**\r\n * 自定义显示格式\r\n *\r\n * @type {Function}\r\n */\r\n format: {\r\n type: Function,\r\n },\r\n /**\r\n * 目标时间\r\n *\r\n * @type {Date, Number}\r\n */\r\n target: {\r\n type: [Date, Number],\r\n },\r\n /**\r\n * 自动倒计时间隔\r\n *\r\n * @type {Number}\r\n */\r\n interval: {\r\n type: Number,\r\n default: 1000,\r\n },\r\n /**\r\n * 计算类型\r\n *\r\n * @type {String}\r\n */\r\n type: {\r\n type: String,\r\n validator(value: string) {\r\n return oneOf(value, ['date', 'number']);\r\n },\r\n default: 'date',\r\n },\r\n },\r\n setup(props: Props, { emit }) {\r\n // data\r\n const data = reactive<Data>({\r\n /**\r\n * 结束时间\r\n *\r\n * @type {Number}\r\n */\r\n lastTime: 0,\r\n /**\r\n * 倒计时函数\r\n *\r\n * @type {Function}\r\n */\r\n countDownTimer: null,\r\n });\r\n\r\n // computed\r\n\r\n // 倒计时数据\r\n const countDownData = computed(() => {\r\n const { format = defaultFormat } = props;\r\n\r\n return format(data.lastTime);\r\n });\r\n\r\n // methods\r\n\r\n // 初始化时间\r\n const initTime = () => {\r\n let lastTime = 0;\r\n let targetTime = 0;\r\n\r\n try {\r\n // 目标时间 传入的是 new Date\r\n if (Object.prototype.toString.call(props.target) === '[object Date]') {\r\n targetTime = props.target.getTime();\r\n }\r\n // 按日期倒计时\r\n else if (props.type === 'date') {\r\n targetTime = new Date(props.target).getTime();\r\n }\r\n } catch (e) {\r\n throwError(prefixCls, `invalid target prop ${e}`);\r\n }\r\n\r\n // 按日期倒计时\r\n if (props.type === 'date') {\r\n lastTime = targetTime - new Date().getTime();\r\n }\r\n\r\n // 按数字倒计时\r\n if (props.type === 'number') {\r\n lastTime = props.target;\r\n }\r\n\r\n return lastTime < 0 ? 0 : lastTime;\r\n };\r\n\r\n // 补零\r\n const initZero = (val: number) => {\r\n return val * 1 < 10 ? `0${val}` : val;\r\n };\r\n\r\n // 倒计时\r\n const countDown = () => {\r\n data.countDownTimer = setTimeout(() => {\r\n // 结束时间 < 自动倒计时间隔\r\n if (data.lastTime < props.interval) {\r\n clearTimeout(data.countDownTimer);\r\n\r\n data.lastTime = 0;\r\n // 结束\r\n emit('on-end');\r\n }\r\n // 倒计时中\r\n else {\r\n data.lastTime -= props.interval;\r\n\r\n countDown();\r\n }\r\n }, props.interval);\r\n };\r\n\r\n // 默认显示格式\r\n const defaultFormat = (time: number) => {\r\n const hours = 60 * 60 * 1000;\r\n const minutes = 60 * 1000;\r\n\r\n const h = Math.floor(time / hours);\r\n const m = Math.floor((time - h * hours) / minutes);\r\n const s = Math.floor((time - h * hours - m * minutes) / 1000);\r\n\r\n return `${initZero(h)}:${initZero(m)}:${initZero(s)}`;\r\n };\r\n\r\n // watch\r\n\r\n // 监听目标时间变化\r\n watch(\r\n () => props.target,\r\n () => {\r\n // 倒计时函数\r\n if (data.countDownTimer) {\r\n clearTimeout(data.countDownTimer);\r\n }\r\n\r\n // 重新设置结束时间\r\n data.lastTime = initTime();\r\n\r\n // 倒计时\r\n countDown();\r\n }\r\n );\r\n\r\n // onMounted\r\n onMounted(() => {\r\n // 设置结束时间\r\n data.lastTime = initTime();\r\n\r\n countDown();\r\n });\r\n\r\n // onBeforeUnmount\r\n onBeforeUnmount(() => {\r\n // 倒计时函数\r\n if (data.countDownTimer) {\r\n clearTimeout(data.countDownTimer);\r\n }\r\n });\r\n\r\n return {\r\n // computed\r\n countDownData,\r\n };\r\n },\r\n});\r\n</script>\r\n"],"names":["_renderSlot"],"mappings":";;;;SAEI,YAA2D,IAAA,EAAA,MAAA,EAAA,MAApD,EAAA,MAAA,EAAS,OAAE,QAAA,EAAA;wCAAkB,CAAA,MAAA,EAAa,IAAA,EAAA;AAAA,IAAAA,UAAA,CAAA,KAAA,MAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,IAAA,CAAA,aAAA,EAAA,EAAA,MAAA;AAAA;;;;;;;;"}