| @ -0,0 +1,270 @@ | |||
| <!-- 首页虚拟滚动 --> | |||
| <template> | |||
| <view class="virtualScroll content"> | |||
| <view class="success_info_body"> | |||
| <!-- 标准title可以调用组件 --> | |||
| <view class="title_view"> | |||
| {{ $t('page.virtualScroll.title') }} | |||
| </view> | |||
| <!-- 参数名称、列数根据实际情况调整 --> | |||
| <view class="table_body"> | |||
| <view class="table_main_body"> | |||
| <view class="table_inner_body" :class="{ animate }" :style="{top: tableTop + 'px'}"> | |||
| <view class="table_tr" v-for="(item,index) in tableList" :key="index"> | |||
| <view class="tr1 tr">{{item.planNo}}</view> | |||
| <view class="tr2 tr">{{item.type}}</view> | |||
| <view class="tr3 tr" v-if="item.startDate!='-'">{{item.startDate}} ~ {{item.endDate}}</view> | |||
| <view class="tr3 tr" v-else>-</view> | |||
| <view class="tr4 tr" v-if="item.process!='-'">{{Number(item.process).toFixed(2)}} %</view> | |||
| <view class="tr4 tr" v-else>-</view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </template> | |||
| <script> | |||
| export default { | |||
| data() { | |||
| return { | |||
| tableTimer: null, | |||
| tableTop: 0, | |||
| tableList: [{ | |||
| "process": 0.0000, | |||
| "planNo": "BP2022060701", | |||
| "endDate": "2022-06-07", | |||
| "type": "砌块", | |||
| "startDate": "2022-06-07" | |||
| }, | |||
| { | |||
| "process": 0.0000, | |||
| "planNo": "WP2022061301", | |||
| "endDate": "2022-06-13", | |||
| "type": "墙板", | |||
| "startDate": "2022-06-13" | |||
| }, | |||
| { | |||
| "process": 0.0000, | |||
| "planNo": "WP2022061301", | |||
| "endDate": "2022-06-13", | |||
| "type": "墙板", | |||
| "startDate": "2022-06-13" | |||
| }, | |||
| { | |||
| "process": 0.0000, | |||
| "planNo": "WP2022061301", | |||
| "endDate": "2022-06-13", | |||
| "type": "墙板", | |||
| "startDate": "2022-06-13" | |||
| }, | |||
| { | |||
| "process": 0.0000, | |||
| "planNo": "WP2022061301", | |||
| "endDate": "2022-06-13", | |||
| "type": "墙板", | |||
| "startDate": "2022-06-13" | |||
| }, | |||
| { | |||
| "process": 0.0000, | |||
| "planNo": "WP2022061301", | |||
| "endDate": "2022-06-13", | |||
| "type": "墙板", | |||
| "startDate": "2022-06-13" | |||
| }, | |||
| { | |||
| "process": 0.0000, | |||
| "planNo": "WP2022061301", | |||
| "endDate": "2022-06-13", | |||
| "type": "墙板", | |||
| "startDate": "2022-06-13" | |||
| } | |||
| ], | |||
| tableListSize: 0, | |||
| componentTimer: null, | |||
| //需要根据情况设置的参数 | |||
| visibleSize: 3, //容器内可视最大完整行数 | |||
| lineHeight: this.getRpxToPx(162), //每行的实际高度(包含margin-top/bottom,border等) | |||
| componentTimerInterval: 3600000, //刷新数据的时间间隔 | |||
| tableTimerInterval: 1000, //向上滚动 1px 所需要的时间,越小越快,推荐值 100 | |||
| animate : true | |||
| } | |||
| }, | |||
| //如果没有父元素传值,将watch内的内容搬至mounted中即可 | |||
| props: ["activeFactoryId"], | |||
| watch: { | |||
| activeFactoryId(val, oldVal) { | |||
| clearInterval(this.componentTimer); | |||
| this.bsGetProductProcess(); | |||
| this.componentTimerFun(); | |||
| } | |||
| }, | |||
| mounted() { | |||
| clearInterval(this.componentTimer); | |||
| this.bsGetProductProcess(); | |||
| this.componentTimerFun(); | |||
| }, | |||
| beforeDestroy() { | |||
| clearInterval(this.componentTimer); | |||
| clearInterval(this.tableTimer); | |||
| }, | |||
| methods: { | |||
| //调用数据接口,获取列表数据 | |||
| bsGetProductProcess() { | |||
| clearInterval(this.tableTimer); | |||
| this.tableTop = 0; | |||
| if (this.activeFactoryId != "") { | |||
| // this.request('forgetPass').then(res => { | |||
| // if(res.code == 200){ | |||
| // this.serverList = res.result | |||
| // } | |||
| // }) | |||
| this.tableActionFun(); | |||
| } | |||
| }, | |||
| tableActionFun() { | |||
| this.tableListSize = this.tableList.length; //数据总数 | |||
| if (this.tableListSize > this.visibleSize) { //总数大于容器内可视最大完整行数 | |||
| this.tableList = this.tableList.concat(this.tableList); //拼接一个数组数据 | |||
| this.tableTimerFun(); | |||
| } else { | |||
| this.fillTableList(); | |||
| } | |||
| }, | |||
| //当数据过少时,不触发自动轮播事件,并填充没有数据的行,参数根据实际情况修改即可 | |||
| fillTableList() { | |||
| var addLength = this.visibleSize - this.tableListSize; | |||
| for (var i = 0; i < addLength; i++) { | |||
| this.tableList.push({ | |||
| planNo: "-", | |||
| type: "-", | |||
| startDate: "-", | |||
| endDate: "-", | |||
| process: "-" | |||
| }); | |||
| } | |||
| }, | |||
| //控制元素滚动 | |||
| tableTimerFun() { | |||
| var count = 0; | |||
| this.tableTimer = setInterval(() => { | |||
| if (count < (this.tableList.length / 2) * this.lineHeight) { | |||
| this.animate = true | |||
| this.tableTop -= this.lineHeight; | |||
| count += this.lineHeight; | |||
| } else { | |||
| this.animate = false | |||
| this.tableTop = 0; | |||
| count = 0; | |||
| } | |||
| }, this.tableTimerInterval); | |||
| }, | |||
| //更新数据 | |||
| componentTimerFun() { | |||
| this.componentTimer = setInterval(() => { | |||
| this.bsGetProductProcess(); | |||
| }, this.componentTimerInterval); | |||
| }, | |||
| //转换rpx单位 | |||
| getRpxToPx(rpx) { | |||
| // 获取系统信息,这里使用同步方法uni.getSystemInfoSync | |||
| const systemInfo = uni.getSystemInfoSync(); | |||
| // 假设设计稿宽度为750rpx | |||
| const designWidth = 750; | |||
| // 屏幕宽度,单位为px | |||
| const screenWidth = systemInfo.screenWidth; | |||
| // 计算1rpx等于多少px | |||
| const rpxToPx = screenWidth / (designWidth / rpx); | |||
| console.log(rpxToPx); | |||
| return rpxToPx; | |||
| } | |||
| } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .virtualScroll { | |||
| width: 100%; | |||
| height: 560rpx; | |||
| } | |||
| .content { | |||
| width: 96%; | |||
| margin: 0 auto; | |||
| color: $uni-bg-color-app; | |||
| } | |||
| .title_view { | |||
| width: 100%; | |||
| font-size: 32rpx; | |||
| } | |||
| .table_body { | |||
| width: 100%; | |||
| margin-top: 15rpx; | |||
| } | |||
| .tr { | |||
| overflow: hidden; | |||
| text-overflow: ellipsis; | |||
| white-space: nowrap; | |||
| box-sizing: border-box; | |||
| padding: 0 5px; | |||
| text-align: center; | |||
| font-size: 30rpx; | |||
| } | |||
| .tr1 { | |||
| width: 28%; | |||
| } | |||
| .tr2 { | |||
| width: 15%; | |||
| } | |||
| .tr3 { | |||
| width: 35%; | |||
| font-size: 24rpx; | |||
| } | |||
| .tr4 { | |||
| flex: 1; | |||
| } | |||
| .table_main_body { | |||
| width: 100%; | |||
| height: 480rpx; | |||
| overflow: hidden; | |||
| position: relative; | |||
| } | |||
| .table_inner_body { | |||
| width: 98%; | |||
| position: absolute; | |||
| left: 1%; | |||
| } | |||
| .animate{ | |||
| transition: all .3s; | |||
| } | |||
| .table_tr { | |||
| display: flex; | |||
| align-items: center; | |||
| height: 140rpx; | |||
| color: $uni-bg-color-app; | |||
| font-size: 30rpx; | |||
| margin-bottom: 20rpx; | |||
| // box-shadow: 2rpx 2rpx 6rpx 1rpx rgba(0, 0, 0, .1), | |||
| // -2rpx -2rpx 6rpx 1rpx rgba(0, 0, 0, .1); | |||
| border-radius: 10rpx; | |||
| background: $uni-bg-color; | |||
| border: 2rpx solid #ccc; | |||
| } | |||
| </style> | |||