countUp.vue 3.5 KB

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