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%
为什么主流大模型架构都在用MoE,而不是传统的Dense?
js如何将图片转换成拼豆图案风格?
ai能接管电脑手机写作剪辑视频自主运营自媒体账号为用户赚钱吗?
python+qwen的api如何实现类似skills的技能创建与自主调用?
python+openai兼容api如何实现自主调用浏览器搜索登录发布信息?
安卓手机投屏电视视频播放结束如何自动播放下一集?
PaddleOCR-VL-1.5与deepseek ocr2谁更好?
电商系统中优惠券规则引擎与组合优惠如何设计避免在代码中重复使用ifelse?
Grok Imagine Video这个ai能根据用户文本指令编辑视频吗?
Openai的Prism到底是啥?


