countUp.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <template>
  2. <view class="number-box">
  3. <block v-for="(myIndex, index) in indexArr" :key="index">
  4. <swiper
  5. class="swiper"
  6. vertical="true"
  7. :current="myIndex"
  8. circular="true"
  9. v-bind:style="{
  10. color: color,
  11. width: myIndex == 10 ? '7px' : width + 'rpx',
  12. height: height + 'rpx',
  13. fontSize: fontSize + 'rpx',
  14. fontWeight
  15. }"
  16. >
  17. <swiper-item><view class="swiper-item">0</view></swiper-item>
  18. <swiper-item><view class="swiper-item">1</view></swiper-item>
  19. <swiper-item><view class="swiper-item">2</view></swiper-item>
  20. <swiper-item><view class="swiper-item">3</view></swiper-item>
  21. <swiper-item><view class="swiper-item">4</view></swiper-item>
  22. <swiper-item><view class="swiper-item">5</view></swiper-item>
  23. <swiper-item><view class="swiper-item">6</view></swiper-item>
  24. <swiper-item><view class="swiper-item">7</view></swiper-item>
  25. <swiper-item><view class="swiper-item">8</view></swiper-item>
  26. <swiper-item><view class="swiper-item">9</view></swiper-item>
  27. <swiper-item><view class="swiper-item">.</view></swiper-item>
  28. </swiper>
  29. </block>
  30. </view>
  31. </template>
  32. <script>
  33. export default {
  34. props: {
  35. num: [String, Number],
  36. color: {
  37. type: String,
  38. default: '#000000'
  39. },
  40. width: {
  41. type: String,
  42. default: '15'
  43. },
  44. height: {
  45. type: String,
  46. default: '15'
  47. },
  48. fontSize: {
  49. type: String,
  50. default: '15'
  51. },
  52. fontWeight: {
  53. type: String,
  54. default: 'bold'
  55. }
  56. },
  57. data() {
  58. return {
  59. indexArr: []
  60. }
  61. },
  62. created() {
  63. let { num } = this
  64. console.log('初始数据', num)
  65. let arr = new Array(num.toString().length)
  66. arr.fill(0)
  67. this.indexArr = arr
  68. },
  69. watch: {
  70. num: function(val, oldVal) {
  71. // 处理新老数据长度不一样的情况
  72. let arr = Array.prototype.slice.apply(this.indexArr)
  73. let newLen = val.toString().length
  74. let oldLen = oldVal.toString().length
  75. if (newLen > oldLen) {
  76. for (let i = 0; i < newLen - oldLen; i++) {
  77. arr.push(0)
  78. }
  79. this.indexArr = arr
  80. }
  81. if (newLen < oldLen) {
  82. for (let i = 0; i < oldLen - newLen; i++) {
  83. arr.pop()
  84. }
  85. this.indexArr = arr
  86. }
  87. this.numChange(val)
  88. }
  89. },
  90. mounted() {
  91. //定时器作用:app显示数字滚动
  92. this._time = setTimeout(() => {
  93. this.numChange(this.num)
  94. clearTimeout(this.time)
  95. }, 50)
  96. },
  97. methods: {
  98. /**
  99. * 数字改变
  100. * @value 数字
  101. */
  102. numChange(num) {
  103. let { indexArr } = this
  104. let copyIndexArr = Array.prototype.slice.apply(indexArr)
  105. let _num = num.toString()
  106. for (let i = 0; i < _num.length; i++) {
  107. if (_num[i] === '.') {
  108. copyIndexArr[i] = 10
  109. } else {
  110. copyIndexArr[i] = Number(_num[i])
  111. }
  112. }
  113. this.indexArr = copyIndexArr
  114. }
  115. }
  116. }
  117. </script>
  118. <style lang="scss" scoped>
  119. .number-box {
  120. display: flex;
  121. flex-wrap: wrap;
  122. justify-content: center;
  123. }
  124. .swiper {
  125. position: relative;
  126. }
  127. .swiper:after {
  128. content: '';
  129. position: absolute;
  130. left: 0;
  131. top: 0;
  132. width: 100%;
  133. height: 100%;
  134. }
  135. </style>