<template> <view class="number-box"> <block v-for="(myIndex, index) in indexArr" :key="index"> <swiper class="swiper" vertical="true" :current="myIndex" circular="true" v-bind:style="{ color: color, width: myIndex == 10 ? '7px' : width + 'px', height: height + 'px', lineHeight: height + 'px', fontSize: fontSize + 'px' }" > <swiper-item> <view class="swiper-item">0</view> </swiper-item> <swiper-item> <view class="swiper-item">1</view> </swiper-item> <swiper-item> <view class="swiper-item">2</view> </swiper-item> <swiper-item> <view class="swiper-item">3</view> </swiper-item> <swiper-item> <view class="swiper-item">4</view> </swiper-item> <swiper-item> <view class="swiper-item">5</view> </swiper-item> <swiper-item> <view class="swiper-item">6</view> </swiper-item> <swiper-item> <view class="swiper-item">7</view> </swiper-item> <swiper-item> <view class="swiper-item">8</view> </swiper-item> <swiper-item> <view class="swiper-item">9</view> </swiper-item> <swiper-item> <view class="swiper-item">.</view> </swiper-item> </swiper> </block> </view> </template> <script> export default { props: { num: [String, Number], color: { type: String, default: '#000000' }, width: { type: String, default: '15' }, height: { type: String, default: '15' }, fontSize: { type: String, default: '15' } }, data() { return { indexArr: [] }; }, created() { let { num } = this; let arr = new Array(num.toString().length); arr.fill(0); this.indexArr = arr; }, watch: { num: function (val, oldVal) { // 处理新老数据长度不一样的情况 let arr = Array.prototype.slice.apply(this.indexArr); let newLen = val.toString().length; let oldLen = oldVal.toString().length; if (newLen > oldLen) { for (let i = 0; i < newLen - oldLen; i++) { arr.push(0); } this.indexArr = arr; } if (newLen < oldLen) { for (let i = 0; i < oldLen - newLen; i++) { arr.pop(); } this.indexArr = arr; } this.numChange(val); } }, mounted() { //定时器作用:app显示数字滚动 this._time = setTimeout(() => { this.numChange(this.num); clearTimeout(this._time); }, 100); }, methods: { /** * 数字改变 * @value 数字 */ numChange(num) { this.$nextTick(() => { let { indexArr } = this; let copyIndexArr = Array.prototype.slice.apply(indexArr); let _num = num.toString(); for (let i = 0; i < _num.length; i++) { if (_num[i] === '.') { copyIndexArr[i] = 10; } else { copyIndexArr[i] = Number(_num[i]); } } this.indexArr = copyIndexArr; }); } } }; </script> <style lang="scss"> .number-box { display: flex; flex-wrap: wrap; justify-content: center; } .swiper { position: relative; font-family: PingFangSC-Heavy, PingFang SC; text-align: center; } .swiper:after { content: ''; position: absolute; left: 0; top: 0; width: 100%; height: 100%; } </style>