<template>
<span>{{ displayNumber.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ")}}</span>
</template>
<script setup>
const props = defineProps({
number: {
type: Number,
required: true
},
})
let displayNumber = $ref(0)
let interval = $ref(null)
onMounted(() => {
displayNumber = props.number
})
watch(() => props.number, (newVal, oldVal) => {
if (newVal === oldVal) return
if (displayNumber === newVal) return
if (interval) {
clearInterval(interval)
interval = null
}
interval = setInterval(() => {
if (displayNumber !== newVal) {
let change = (newVal - displayNumber) / 10
change = change > 0 ? Math.ceil(change) : Math.floor(change)
displayNumber += change
} else {
clearInterval(interval)
interval = null
}
}, 20)
})
</script>
<style scoped>
</style>
куда это пихать ха вуе не шарюVUE example:
JavaScript:<template> <span>{{ displayNumber.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ")}}</span> </template> <script setup> const props = defineProps({ number: { type: Number, required: true }, }) let displayNumber = $ref(0) let interval = $ref(null) onMounted(() => { displayNumber = props.number }) watch(() => props.number, (newVal, oldVal) => { if (newVal === oldVal) return if (displayNumber === newVal) return if (interval) { clearInterval(interval) interval = null } interval = setInterval(() => { if (displayNumber !== newVal) { let change = (newVal - displayNumber) / 10 change = change > 0 ? Math.ceil(change) : Math.floor(change) displayNumber += change } else { clearInterval(interval) interval = null } }, 20) }) </script> <style scoped> </style>
Credits: https://stackoverflow.com/questions/35531629/vuejs-animate-number-changes
Это отдельный компонент, стили накидываются так же через spanкуда это пихать ха вуе не шарю
ага непонялЭто отдельный компонент, стили накидываются так же через span
Основная логика - в вотчере(следит за изменениями значения)
агресивно