wangzhibo
2026-07-16 b57020623cf0c946706573bf102e548c3a544423
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<template>
    <span class="cl-number">
        {{ text }} <span class="cl-number__suffix" v-if="suffix">{{ suffix }}</span>
    </span>
</template>
 
<script setup lang="ts">
defineOptions({
    name: 'cl-number'
});
 
import { useTransition } from '@vueuse/core';
import { computed, type PropType } from 'vue';
 
const props = defineProps({
    modelValue: Number,
    value: Number,
    fixed: Number,
    duration: {
        type: Number,
        default: 1000
    },
    type: {
        type: String as PropType<'amount' | 'number'>,
        default: 'number'
    },
    suffix: String
});
 
const transitionedValue = useTransition(
    computed(() => props.modelValue || props.value! || 0),
    {
        duration: props.duration
    }
);
 
const text = computed(() => {
    const val = transitionedValue.value;
 
    if (props.type === 'amount') {
        // 若需要小数位数控制,可以使用 toFixed 再转数值:
        const fixedVal = props.fixed !== undefined ? Number(val.toFixed(props.fixed)) : val;
 
        // 利用 toLocaleString 增加千分位分隔符
        return fixedVal.toLocaleString(undefined, {
            minimumFractionDigits: props.fixed || 0,
            maximumFractionDigits: props.fixed || 0
        });
    } else {
        return val.toFixed(0);
    }
});
</script>
 
<style lang="scss" scoped>
.cl-number {
    &__suffix {
        font-size: 14px;
    }
}
</style>