CountTo.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <script setup lang="ts">
  2. import { ContentWrap } from '@/components/ContentWrap'
  3. import { useI18n } from '@/hooks/web/useI18n'
  4. import { CountTo } from '@/components/CountTo'
  5. import { ElRow, ElCol, ElInputNumber, ElInput } from 'element-plus'
  6. import { ref, unref } from 'vue'
  7. const { t } = useI18n()
  8. const countRef = ref<ComponentRef<typeof CountTo>>()
  9. const startVal = ref(0)
  10. const endVal = ref(1314512)
  11. const duration = ref(3000)
  12. const decimals = ref(0)
  13. const separator = ref(',')
  14. const prefix = ref('¥ ')
  15. const suffix = ref(' rmb')
  16. const autoplay = ref(false)
  17. const start = () => {
  18. unref(countRef)?.start()
  19. }
  20. const pauseResume = () => {
  21. unref(countRef)?.pauseResume()
  22. }
  23. </script>
  24. <template>
  25. <ContentWrap :title="t('countToDemo.countTo')" :message="t('countToDemo.countToDes')">
  26. <div class="text-center mb-40px">
  27. <CountTo
  28. ref="countRef"
  29. :start-val="startVal"
  30. :end-val="endVal"
  31. :duration="duration"
  32. :decimals="decimals"
  33. :separator="separator"
  34. :prefix="prefix"
  35. :suffix="suffix"
  36. :autoplay="autoplay"
  37. class="text-30px font-bold text-[var(--el-color-primary)]"
  38. />
  39. </div>
  40. <ElRow :gutter="20" justify="space-between">
  41. <ElCol :xl="8" :lg="8" :md="12" :sm="24" :xs="24">
  42. <div class="flex mb-20px items-center">
  43. <span class="min-w-90px text-right">{{ t('countToDemo.startVal') }}:</span>
  44. <ElInputNumber v-model="startVal" :min="0" />
  45. </div>
  46. </ElCol>
  47. <ElCol :xl="8" :lg="8" :md="12" :sm="24" :xs="24">
  48. <div class="flex mb-20px items-center">
  49. <span class="min-w-90px text-right">{{ t('countToDemo.endVal') }}:</span>
  50. <ElInputNumber v-model="endVal" :min="1" />
  51. </div>
  52. </ElCol>
  53. <ElCol :xl="8" :lg="8" :md="12" :sm="24" :xs="24">
  54. <div class="flex mb-20px items-center">
  55. <span class="min-w-90px text-right">{{ t('countToDemo.duration') }}:</span>
  56. <ElInputNumber v-model="duration" :min="1000" />
  57. </div>
  58. </ElCol>
  59. <ElCol :xl="8" :lg="8" :md="12" :sm="24" :xs="24">
  60. <div class="flex mb-20px items-center">
  61. <span class="min-w-90px text-right">{{ t('countToDemo.separator') }}:</span>
  62. <ElInput v-model="separator" />
  63. </div>
  64. </ElCol>
  65. <ElCol :xl="8" :lg="8" :md="12" :sm="24" :xs="24">
  66. <div class="flex mb-20px items-center">
  67. <span class="min-w-90px text-right">{{ t('countToDemo.prefix') }}:</span>
  68. <ElInput v-model="prefix" />
  69. </div>
  70. </ElCol>
  71. <ElCol :xl="8" :lg="8" :md="12" :sm="24" :xs="24">
  72. <div class="flex mb-20px items-center">
  73. <span class="min-w-90px text-right">{{ t('countToDemo.suffix') }}:</span>
  74. <ElInput v-model="suffix" />
  75. </div>
  76. </ElCol>
  77. <ElCol :span="24">
  78. <div class="text-center">
  79. <BaseButton type="primary" @click="start">{{ t('countToDemo.start') }}</BaseButton>
  80. <BaseButton @click="pauseResume">
  81. {{ t('countToDemo.pause') }}/{{ t('countToDemo.resume') }}
  82. </BaseButton>
  83. </div>
  84. </ElCol>
  85. </ElRow>
  86. </ContentWrap>
  87. </template>