@zhsz/cool-design-dv
Version:
140 lines (139 loc) • 4.09 kB
JavaScript
;
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
const vue = require("vue");
const dayjs = require("dayjs");
require("./style.css");
const _hoisted_1 = { class: "my-dv-timer" };
const __default__ = vue.defineComponent({
name: "DvTimer"
});
const _sfc_main = /* @__PURE__ */ vue.defineComponent({
...__default__,
props: {
// 设定值,String为时间格式,Number是秒数, countdown为true, 是开始值, countdown为false时结束值
target: [String, Number],
// 显示格式
format: {
type: String,
default: "HH:mm:ss"
},
// 倒数模式
countdown: Boolean,
// 颜色
type: {
type: String,
validator(val) {
return ["primary", "success", "warning", "danger", "info"].includes(val);
}
},
// 自动开始
auto: Boolean,
// 执行时间隔 单位 ms
interval: {
type: Number,
default: 1e3
}
},
emits: ["start", "stop", "reset", "finish", "tick"],
setup(__props, { emit: __emit }) {
const props = __props;
const $attrs = vue.useAttrs();
const $emit = __emit;
const timerId = vue.ref();
const dayInstance = vue.ref();
const targetDayjs = vue.ref();
const minDayjs = vue.ref();
const isFinish = vue.ref(false);
const classes = vue.computed(() => {
return {
"my-timer": true,
[`is-${props.type}`]: !!props.type,
"is-finish": isFinish.value
};
});
const displayValue = vue.computed(() => {
return dayInstance.value ? dayInstance.value.format(props.format) : "";
});
function init() {
reset();
props.auto && start();
}
function getTarget() {
if (!props.target) {
return getMax();
}
if (typeof props.target === "number") {
return getMin().second(props.target);
}
if (typeof props.target === "string") {
return dayjs(`${getMin().format("YYYY-MM-DD")} ${props.target}`);
}
}
function getMin() {
return dayjs().hour(0).minute(0).second(0).millisecond(0);
}
function getMax() {
return dayjs().hour(23).minute(59).second(59);
}
function start() {
if (!dayInstance.value)
return;
clearInterval(timerId.value);
timerId.value = setInterval(() => {
tick();
}, props.interval);
$emit("start", dayInstance.value);
}
function reset() {
isFinish.value = false;
clearInterval(timerId.value);
minDayjs.value = Object.freeze(getMin());
targetDayjs.value = Object.freeze(getTarget());
dayInstance.value = props.countdown ? Object.freeze(getTarget()) : Object.freeze(getMin());
$emit("reset", dayInstance.value);
}
function tick() {
if (!dayInstance.value)
return;
if (props.countdown) {
dayInstance.value = Object.freeze(
dayInstance.value.subtract(props.interval, "millisecond")
);
if (dayInstance.value.valueOf() === minDayjs.value.valueOf()) {
isFinish.value = true;
}
} else {
dayInstance.value = Object.freeze(
dayInstance.value.add(props.interval, "millisecond")
);
if (dayInstance.value.valueOf() === targetDayjs.value.valueOf()) {
isFinish.value = true;
}
}
if (isFinish.value) {
clearInterval(timerId.value);
$emit("finish", dayInstance.value);
} else {
$emit("tick", dayInstance.value);
}
}
vue.watch(
() => props.target,
() => {
init();
}
);
vue.onMounted(() => {
init();
});
vue.onBeforeUnmount(() => {
clearInterval(timerId.value);
});
return (_ctx, _cache) => {
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
vue.createElementVNode("div", vue.mergeProps({ class: classes.value }, vue.unref($attrs)), vue.toDisplayString(displayValue.value), 17)
]);
};
}
});
exports.default = _sfc_main;