| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 | import { VantComponent } from '../common/component';import { isSameSecond, parseFormat, parseTimeData } from './utils';function simpleTick(fn) {    return setTimeout(fn, 30);}VantComponent({    props: {        useSlot: Boolean,        millisecond: Boolean,        time: {            type: Number,            observer: 'reset',        },        format: {            type: String,            value: 'HH:mm:ss',        },        autoStart: {            type: Boolean,            value: true,        },    },    data: {        timeData: parseTimeData(0),        formattedTime: '0',    },    destroyed() {        clearTimeout(this.tid);        this.tid = null;    },    methods: {        // 开始        start() {            if (this.counting) {                return;            }            this.counting = true;            this.endTime = Date.now() + this.remain;            this.tick();        },        // 暂停        pause() {            this.counting = false;            clearTimeout(this.tid);        },        // 重置        reset() {            this.pause();            this.remain = this.data.time;            this.setRemain(this.remain);            if (this.data.autoStart) {                this.start();            }        },        tick() {            if (this.data.millisecond) {                this.microTick();            }            else {                this.macroTick();            }        },        microTick() {            this.tid = simpleTick(() => {                this.setRemain(this.getRemain());                if (this.remain !== 0) {                    this.microTick();                }            });        },        macroTick() {            this.tid = simpleTick(() => {                const remain = this.getRemain();                if (!isSameSecond(remain, this.remain) || remain === 0) {                    this.setRemain(remain);                }                if (this.remain !== 0) {                    this.macroTick();                }            });        },        getRemain() {            return Math.max(this.endTime - Date.now(), 0);        },        setRemain(remain) {            this.remain = remain;            const timeData = parseTimeData(remain);            if (this.data.useSlot) {                this.$emit('change', timeData);            }            this.setData({                formattedTime: parseFormat(this.data.format, timeData),            });            if (remain === 0) {                this.pause();                this.$emit('finish');            }        },    },});
 |