如何给列表加上抖音式无限加载:开源项目 douyin-vue 完整拆解

发布时间:2026/10/16 15:27:18

如何给列表加上抖音式无限加载:开源项目 douyin-vue 完整拆解 如何给列表加上抖音式无限加载开源项目 douyin-vue 完整拆解【免费下载链接】douyinVue3 Pinia 仿抖音Vue 在移动端的最佳实践 . Imitate TikTok Vue Best practices on Mobile项目地址: https://gitcode.com/GitHub_Trending/do/douyindouyin-vue 是一个用 Vue3 Vite5 Pinia 搭出来的移动端短视频应用数据走本地 mock 模拟真实后端。这次不聊视频播放只拆其中一套最有复用价值的技巧抖音式无限滚动列表。项目把取数据和处理滑动拆成ScrollList与Scroll两层组件列表跟着手指走、自动翻页全程没有一个加载更多按钮。没有无限加载列表体验是什么样很多网页列表第一屏加载完底部就躺着一个加载更多按钮。点一下等几秒多出十条再想多看还得滚回底部再点一次。网络慢的时候用户盯着白块干等数据到了列表又猛地跳一下。抖音式无限滚动列表要解决的是两件事手指不用离开屏幕数据刚刚好到位——不早到浪费带宽不晚到露出空白。 这个项目的整体方案项目把无限滚动列表收进 src/components/ 下的两个文件各管一摊ScrollList.vue管数据页码走到哪了、总共多少条、是不是有请求在飞Scroll.vue管交互监听滚动、决定何时触发翻页顺带做出下拉刷新。页面自己只声明一件事——数据从哪来ScrollList :apirecommendedShop template #default{ list } !-- 列表项渲染 -- /template /ScrollList这段只把请求函数交给组件翻页时机、拼接、加载状态全部由两个组件内部处理页面代码因此非常薄。数据层分页请求怎么防重复最容易被忽略的细节是快速滑动时 scroll 事件短时间能触发几十次不加防护一页数据能刷出一堆重复请求。ScrollList用一个reactive状态兜住全局const state reactive({ list: [], // 已渲染的数据 total: 0, // 服务端返回的总条数 pageNo: 0, // 下一次要取的页码 pageSize: 10, // 每页 10 条 loading: false // 请求飞行中标记 })这五个字段描述了列表此刻的全部处境后续逻辑都围绕它们转。真正干活的在getData里关键就是开头那个加载锁if (state.loading) return state.loading true let res await props.api({ pageNo: state.pageNo, pageSize: state.pageSize }) state.loading false if (res.success) { state.list state.list.concat(res.data.list) state.total res.data.total }第一行就是锁请求在飞时任何新触发直接丢弃像卫生间门上的使用中牌子后面的人只能等这一轮结束。返回数据用concat接到旧数组尾部已有节点原样保留Vue 的 diff 只会处理新增部分滚动位置不会被新数据顶走。另外服务端会带total回来getData开头就判断取够了没有取够了连请求都不发。交互层预加载与下拉刷新下一页什么时候取60px 提前量Scroll在 scroll 事件里做了一道减法if (this.wrapper.scrollHeight - this.wrapper.clientHeight this.wrapper.scrollTop 60) { this.$emit(pulldown) }内容总高减视口高就是还能往下滚多远。这个值一旦小于 60说明马上到底先发pulldown事件。60px 就是提前量太大会去取用户还没打算看的数据太小用户会先撞见空白。下拉刷新的 300ms 弹性开启useRefresh后Scroll会盯着手指scrollTop为 0 时继续下拖就记下起点、算出位移拉伸上限压到 10px抬手瞬间发出refresh事件同时把过渡时长从 0ms 切到 300msreturn { transition-duration: this.refresh ? 300ms : 0ms, transform: translate3d(0px, ${this.distance}px, 0) }拖动时时长为 0内容 1:1 跟手松手后 300ms 回弹。那种松手被弹回去的手感就是这 300ms 给的。反馈层加载状态给用户看什么一个合格的无限滚动列表不会全程沉默代码里分了三档场景展示什么首次进入、list为空全屏 Loading由:full-loading!state.list.length驱动滚动中取下一页列表尾部一个小型 Loading数据取完NoMore组件文案暂时没有更多了NoMore的出现条件只有一行NoMore v-ifstate.total ! 0 state.total state.list.length /直白说服务端明确告知了总数、且已加载数追平总数才告诉用户没有更多了total为 0 时不显示避免空列表挂着没有更多的尴尬。组件对外暴露的入参与事件汇总如下名称类型说明apiFunction请求函数收pageNo/pageSize需返回{ success, data }loadingBoolean控制尾部加载指示fullLoadingBoolean控制全屏加载指示事件触发时机pulldown距列表底部不足 60pxrefresh顶部下拉达到阈值后松手fixed设置了fixedHeight且scrollTop超过它常用于吸顶跑起来以及接下来能用在哪项目里这套组件已经落地在多个页面商城推荐流 Shop.vue 里每个 item 是一张商品卡社区推荐流 Community.vue 里每个 item 是一条帖子。同一个ScrollList换的只是插槽内容。本地跑通只需四步git clone https://gitcode.com/GitHub_Trending/do/douyin cd douyin npm install npm run dev浏览器切手机模式F12 后按 CtrlShiftM访问 127.0.0.1:3000就能在商城页里亲手体验滚动到底部的自动翻页。项目完整代码地址就是上面这条 clone 命令里的仓库。想再往前推一步有三个现成方向用IntersectionObserver只渲染视口内的条目仓库里的 WaterfallList.vue 展示了按奇偶分两列的拆分思路给getData补一个 catch 分支做失败重试把Scroll的触摸监听从纵向扩到横向复用到轮播场景。【免费下载链接】douyinVue3 Pinia 仿抖音Vue 在移动端的最佳实践 . Imitate TikTok Vue Best practices on Mobile项目地址: https://gitcode.com/GitHub_Trending/do/douyin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/8 22:03:13

企业微信外部群实时同步CRM实战指南

1. 外部群同步不是“导出Excel”,而是实时业务流重建企业微信的外部群,尤其是客户群、服务群、分销群,早已不是简单的聊天容器——它承载着真实的客户触点、销售线索、服务工单甚至交易意向。但很多团队还在用“每天手动导出群成员列表→复制…

2026/10/15 7:50:33

Wazuh安装踩坑指南:版本兼容、离线部署与国产化适配

1. 为什么Wazuh安装不是“照着文档点几下”就能完事的Wazuh不是那种装完就跑的轻量级工具,它本质是一套融合了HIDS(主机入侵检测)、日志分析、合规审计和威胁响应能力的完整安全监控平台。它的安装过程之所以被无数运维、安全工程师称为“噩梦…

2026/10/15 5:06:54

安卓逆向实战指南:脱壳、Frida Hook与动态分析全流程

做安卓逆向的人,手里几乎没有没碰过加壳App的。不管是分析恶意样本、做漏洞挖掘,还是想搞明白某款应用的核心逻辑,第一步都是把黑盒拆成白盒。这个拆的过程,在安全圈里一般叫逆向,放到具体场景里就是反编译、动态调试、…

2026/10/16 21:08:56

CDH及软件安装部署全流程:从环境准备到集群调优实战

聊到CDH及软件安装部署,我脑海里最先冒出来的不是安装成功后的绿色对勾,而是去年在一家客户现场,整整一周都在和parcel下载较劲的那个画面。当时机房没有外网,安装包是拷进内网的,结果agent连上Cloudera Manager后&…

2026/10/16 21:08:56

GEE监督分类全流程详解:从样本构建到精度验证的关键技术

做遥感的人,早晚都要过监督分类这一关。Google Earth Engine(GEE)把这扇门开得比别人都大——官方示例里三四十行代码就能出一张分类图,看起来相当唬人。但真正上手你就会发现,同样一套流程,换一个区域、换…

2026/10/16 21:08:56

YOLO训练不收敛怎么办?从数据标注到超参数的避坑指南

很多刚接触YOLO的朋友都问过我同一个问题:为什么我的loss死活不降,训练了好几个epoch,mAP还是0.几?或者说,loss降了,可是预测出来的框全是歪的,根本没法用。我自己的第一个正式项目就栽了个大跟…

2026/10/16 21:08:56

NARX vs BP:时间序列预测中延时动态网络的结构、训练与实战对比

预测分析这件事,做得越久越有个体会:绝大多数实际问题都不是“看图识物”那种一次性映射,而是拿着一段历史走势去推断下一拍会发生什么。最早我用BP神经网络做这类任务时,效果一直差口气——不是收敛不动,就是精度上不…

2026/10/16 21:08:56

AI+知识图谱建设方案PPT:从架构设计到落地避坑指南

这两年做数据类项目,被同行问到最多的就是“AI知识图谱”的方案PPT怎么写。说实话,市面上这类材料不少,但大部分要么通篇概念,甲方听完觉得“很高级”却记不住你要做什么;要么全是产品截图,讲完只剩一个印象…

2026/10/16 21:03:56

一次总结:把经验转化为可复用资产的方法与实操流程

1. 为什么“一次总结”值得单独拿出来做“一次总结”这四个字,乍一看像是一句随口说的话,不像一个正经项目名。但我干了十多年一线,越来越觉得,真正拉开人与人差距的,往往不是谁做了多炫酷的新东西,而是谁能…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/16 0:01:11

Cephadm实战指南:Linux系统工程师的生产级Ceph集群部署与排障

简介:本资源是一份完整的Ceph分布式存储系统中文技术文档合集,面向Linux系统运维工程师、云平台架构师及存储方向开发者,帮助读者系统掌握Ceph集群的部署、配置与运维核心能力。文档覆盖对象存储(RGW)、块设备&#xf…

2026/10/16 0:01:11

ITK中SpatialObject几何体系解析:坐标系、变换与管道集成

1. 空间对象的定位:为什么 ITK 需要一套几何描述体系很多刚开始接触 ITK 的朋友,包括我自己,最初都是被它的图像滤波、配准、分割这些“正统”功能吸引进来的。等真正上手做点实际项目,比如把分割出来的器官边界做量化分析、给血管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑