uniapp向上滚动虚拟列表加载更多无缝丝滑滚动如何实现?
网友回复
通过scroll监听和虚拟列表技术实现,完整代码如下:
<template> <view class="virtual-list"> <scroll-view class="scroll-view" scroll-y :scroll-top="scrollTop" :style="{ height: height + 'px' }" @scroll="onScroll" :scroll-with-animation="false" > <view class="loading" v-if="isLoading">加载中...</view> <view class="list-content" :style="{ height: totalHeight + 'px' }"> <view v-for="item in visibleData" :key="item.id" class="list-item" :style="{ transform: `translateY(${item.top}px)`, position: 'absolute', width: '100%' }" > <view :class="['message', item.isSelf ? 'self' : 'other']"> <view class="avatar">{{item.isSelf ? '我' : '对方'}}</view> <view class="content">{{item.content}}</view> </view> </view> </view> </scroll-view> </view> </template> <script> export default { data() { return { height: 0, itemHeight: 80, visibleCount: 0, bufferCount: 5, listData: [], visibleData: [], isLoading: false, scrollTop: 0, startIndex: 0, loadMoreThreshold: 500, lastLoadTime: 0, loadCooldown: 1000, totalHeight: 0, lastScrollTop: 0, scrollTimeout: null } }, async mounted() { const sysInfo = uni.getSystemInfoSync() this.height = sysInfo.windowHeight this.visibleCount = Math.ceil(this.height / this.itemHeight) + this.bufferCount * 2 await this.initData() }, methods: { async initData() { const initList = Array(30).fill(0).map((_, index) => ({ id: index, content: `Message ${index}`, isSelf: Math.random() > 0.5, top: index * this.itemHeight })) this.listData = initList this.totalHeight = this.listData.length * this.itemHeight this.updateVisibleData() }, updateVisibleData() { ...
点击查看剩余70%
为啥所有的照片分辨率提升工具都会修改照片上的图案细节?
js如何在浏览器中将webm视频的声音分离为单独音频?
微信小程序如何播放第三方域名url的mp4视频?
ai多模态大模型能实时识别视频中的手语为文字吗?
如何远程调试别人的chrome浏览器获取调试信息?
为啥js打开新网页window.open设置窗口宽高无效?
浏览器中js的navigator.mediaDevices.getDisplayMedia屏幕录像无法录制SpeechSynthesisUtterance产生的说话声音?
js中mediaRecorder如何录制window.speechSynthesis声音音频并下载?
python如何直接获取抖音短视频的音频文件url?
js在浏览器中如何使用MediaStream与MediaRecorder实现声音音频多轨道混流?