diff options
Diffstat (limited to 'src/tools/chronometer/chronometer.vue')
-rw-r--r-- | src/tools/chronometer/chronometer.vue | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/tools/chronometer/chronometer.vue b/src/tools/chronometer/chronometer.vue index 2efcdc1..16009ff 100644 --- a/src/tools/chronometer/chronometer.vue +++ b/src/tools/chronometer/chronometer.vue @@ -1,11 +1,11 @@ <template> <div> <n-card> - <div class="duration">{{ formatChronometerTime({ elapsed: counter, msPerUnit }) }}</div> + <div class="duration">{{ formatMs(counter) }}</div> </n-card> <br /> <n-space justify="center"> - <n-button v-if="!isActive" secondary type="primary" @click="resume">Start</n-button> + <n-button v-if="!isRunning" secondary type="primary" @click="resume">Start</n-button> <n-button v-else secondary type="warning" @click="pause">Stop</n-button> <n-button secondary @click="counter = 0">Reset</n-button> @@ -14,12 +14,33 @@ </template> <script setup lang="ts"> -import { useInterval } from '@vueuse/core'; -import { formatChronometerTime } from './chronometer.service'; +import { useRafFn } from '@vueuse/core'; +import { ref } from 'vue'; +import { formatMs } from './chronometer.service'; -const msPerUnit = 10; +const isRunning = ref(false); +const counter = ref(0); -const { counter, pause, resume, isActive } = useInterval(msPerUnit, { controls: true, immediate: false }); +let previousRafDate = Date.now(); +const { pause: pauseRaf, resume: resumeRaf } = useRafFn( + () => { + const deltaMs = Date.now() - previousRafDate; + previousRafDate = Date.now(); + counter.value += deltaMs; + }, + { immediate: false }, +); + +function resume() { + previousRafDate = Date.now(); + resumeRaf(); + isRunning.value = true; +} + +function pause() { + pauseRaf(); + isRunning.value = false; +} </script> <style lang="less" scoped> |