vue-infinite-scroll 源码阅读&排坑

Element|InfiniteScroll 无限滚动组件的具体使用方法 Element|InfiniteScroll 无限滚动组件的具体使用方法 在前端开发中,很多页面都需要实现无限滚动的效果,即当页面滚动到底部时,自动加载更多的数据。Element Infinitescroll 是一款方便易用的 Vue 组件,可以帮助我们快速实现无限滚动功能。 目录 InfiniteScroll 无限滚动 基本用法 详细说明 v-infinite-scroll 指令 infinite-scroll-disabled 属性 infinite-scroll-distance 属性 总结 阅读详情

1. 场景说明

我们的前端项目中主要用第三方库vue-infinite-scroll来实现无限滚动列表。然而,在最近写一个需求时,发现基于vue-infinite-scroll来实现列表的无限滚动时,会有无法触发滚动事件的问题。这样导致了列表滚动到底部时,无法拉取新的数据。经过查阅第三方库vue-infinite-scroll的官方文档,以及参考项目中使用到此库的其他地方,发现在用法上没有什么异常。就此基于查看源码去做一个详细的研究。

  1. 源代码阅读 & 猜想
    =============

在node_modules下面找到了vue-infinite-scroll库所在的地方,很幸运,打包后的代码没有压缩成完全看不懂的样子,且仅有简短的236行。这意味着我们理解代码的时间不需要太长。同时,后面我们能够直接修改打包后的文件来进行调试,验证研究中的各种猜想。

按照职能阅读: 尽管代码量不大,但以快速解决问题为目的。我们还是需要避重就轻,只阅读对解决问题有必要的部分即可。通过略读代码,根据函数名划分函数职能,可以帮助我们很好地做到这一点。

  • 简单工具类函数:getScrollTop, getVisibleHeight, getElementTop等,从函数名看出它们的主要职能都是获取列表元素的一些基本属性,加以处理来实现无限滚动。而我们的bug出现在同一浏览器和网络环境中,理论上不存在因为兼容性问题导致这些函数工作异常的情况。(约100行,都可以略过)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zzkaRTMI-1656055287398)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ecc89eef1c9a470fa11bbda1fb3f5ff1~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

  • 核心事件/属性绑定函数**doBind** : 这个函数里做了许多绑定操作,包括滑动时scroll事件的回调绑定,以及是否允许列表继续滑动,滑动距离等自定义属性的绑定操作。所以,我们的列表在滑动时,无法触发事件很有可能就是因为在这里面的绑定操作失败了。

2.png

  • 主函数: 负责把各种职能的函数组织在一起,以实现vue-infinite-scroll的功能

在根据源代码的职能进行略读之后,我们重点关注绑定函数doBind部分。在主函数中,我发现了vue-infinite-scroll是通过监听组件本身的mounted钩子来执行事件/属性的绑定的。

3.png

因此,我们作出猜想:上述遇到的无法触发滚动事件的原因,可能正正是因为监听不到/错过了组件本身的mounted生命周期钩子

3. 解决问题

调试

上文分析到,vue-infinite-scroll的代码并没有压缩得很难看,我们能够直接修改打包后的文件来进行调试。于是我们在源代码中添加一个简单的断点进行调试:不出所料, 我们的程序并没有进入这个代码块中。

4.png

那么问题定位成功了:vue-infinite-scroll的代码在运行时(监听不到/错过了)组件本身的mounted生命周期钩子,导致一系列滚动事件都无法进行绑定。或者是,组件本身的mounted钩子触发时,vue-infinite-scroll的代码仍未初始化完成。

尝试解决

有了生命周期这一线索,我最后把目光放在了一个简单的vue指令:v-if(我用了这个指令来控制列表的显隐状态)。简单地把v-if改成了v-show, bug就神奇地解决了,列表再次正常滚动,并在滚动到底端的时候触发loadMore事件。

原因分析

先说说 v-show 和 v-if。 v-show 指令是通过控制元素的css属性(display)从而实现显示和隐藏的效果,这也就说无论 v-show 是true还是false,元素都会有初始渲染。v-if 就跟 v-show 不太一样了,v-if 状态改变时,是真实进行相关的DOM操作的(插入和删除),也就是说,当 v-if 是false时, 元素就不会有初始渲染。

基于上面说的,使用v-if 时:

  1. 解析到列表元素时,发现v-if="false":列表元素不进行初始渲染,doBind函数没有执行,无法进行组件mounted钩子的监听。

2.解析完成,组件挂载完毕(执行了mounted生命周期钩子),但没有被vue-infinite-scroll监听到,绑定逻辑代码没有执行。

  1. 设置v-if="true":列表元素初始渲染,vue-infinite-scroll绑定逻辑代码doBind执行,开始监听mounted生命周期钩子。但组件已完成mounted,vue-infinite-scroll错过了mounted生命周期钩子,无法完成滚动等基础事件的绑定,后续滚动列表等操作无相关响应。

而在使用v-show 时:

  1. 解析到列表元素时,发现v-show="false":但列表元素依然进行初始渲染,只是通过css控制其隐藏。此时vue-infinite-scrolld对列表元素执行doBind函数,并进行组件mounted钩子的监听。

  2. 解析完成,组件挂载完毕(执行了mounted生命周期钩子),被vue-infinite-scroll监听到,执行滑动事件等相应的绑定逻辑代码。

  3. 设置v-show="true":通过css设置列表元素显示,doBind函数中滚动等基础事件的绑定早已完成,后续滚动列表等操作可以正常响应。

4. 拓展: npm包的调试

遇到第三方npm包相关的bug时,调试其代码是非常重要的一步,也做一个拓展总结,请移步 NPM包调试方式总结

Vue Skills:教AI像资深Vue开发者一样思考与决策 Vue Skills 并非单纯的技术栈应用,而是一种将 Vue 响应式心智、Pinia 状态契约和 Router 时序逻辑系统化编码为 AI 可执行规则的工程方法论。它源于对 Vue 生态底层原理(如 ref/reactive 语义差异、computed 纯函数约束、store 不可变更新、路由守卫同步性要求)的深度理解,并将其转化为可验证的提示工程实践。这种能力使 AI 从语法补全工具跃升为能处理 SSR hydration mismatch、权限重定向降级、SSR 状态序列化等复杂场景的协作者。其技术价 阅读详情

相关推荐

动态网站爬虫实战:从API调用到无头浏览器的三种核心方案

网络爬虫技术是数据采集领域的基础工具,其核心原理是通过模拟HTTP请求获取网页内容并解析提取结构化信息。在静态网页场景中,直接解析HTML文档树即可完成数据提取,但随着前端技术的发展,大量现代网站采用动态渲染技术,数据通过JavaScript异步加载,传统爬虫方法面临失效挑战。从技术价值角度看,动态爬虫需要模拟浏览器执行环境,重现数据生成过程,这对爬虫工程的健壮性和可维护性提出了更高要求。在应用场景上,电商商品列表、社交媒体信息流、实时数据仪表板等单页面应用(SPA)都需要动态爬取方案。针对动态内容,目前主

weixin_33937913的博客 543

vue-infinite-scroll的使用细节介绍

v-infinite-scroll使用

jincheng_的博客 5695

纯CSS移动端网站:零JS、强制手机访问、Flex+Grid+变量实战

HTML和CSS是构建网页的基石技术,其核心价值在于轻量、可控与极致性能。在移动优先场景下,纯CSS方案通过Flex布局实现一维弹性排布,Grid完成二维结构划分,CSS自定义变量统一管理颜色、间距与动效参数,使样式真正成为可配置的数据。这种技术路径规避了JavaScript带来的首屏延迟、兼容性风险与状态复杂度,特别适用于扫码即用、快闪活动、展会落地页等强时效性场景。结合viewport锁定、设备级媒体查询与优雅降级策略,能确保在iPhone SE至华为P30等中低端机型上稳定运行。本文聚焦于真实项目中高

weixin_33681778的博客 1117

vue无限滚动vue-infinite-scroll插件的配置及使用详解

vue开发使用上拉加载更多之vue-infinite-scroll

小蔡蔡的博客笔记 1万+

详解无限滚动插件vue-infinite-scroll源码解析

主要介绍了详解无限滚动插件vue-infinite-scroll源码解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

相机中的归一化实现讲解

本分讲解了图像处理中常出现的两个相机归一化操作

weixin_42102084的博客 1475

Element UI - v-infinite-scroll无限滚动组件

InfiniteScroll 无限滚动

Subuprogrammer的博客 1万+

Field _II 仿真 学习笔记

参考Field II的使用说明,进行了四个例子的练习。仿真程序和结果如下: PURPOSE1:Calculate the received response from all elements of a linear array and plot the responses and the summed response 【计算来自所有线性阵元的接收响应,并绘制该响应以及叠加响应。】 >>

qq_34018578的博客 1万+

vue muit-ui infinite-scroll源码解析

infinite scroll基本使用vue的mint-ui的infinite scroll的基本使用地址:infinite-scroll接入指南. 简单解释一下: 1、指令接受的method:处理loadmore回调 2、自定义属性infinite-scroll-disabled:为false时:不会进行是否到达底部的判断,因此就触发不了loadmore回调 3、自定义属性infinite

ScheduledThreadPoolExecutor原理源码解析 1万+

深度可分离卷积(DepthwiseSeparableConvolution):Depthwise卷积与Pointwise卷积

深度可分离卷积不用多说,在轻量级网络架构方面是一个绕不开的话题,只要接触深度学习多多少少会接触。深度可分离卷积即DepthwiseSeparableConvolution,该卷积将一个常规卷积过程划分成两个完成Depthwise卷积和Pointwise卷积,在保证输出一样时,计算量大大降低。首先来看,一个常规卷积是怎么实现的。其示意图如果我们从通道数变换的角度来看,卷积就是将3通道的tensor变为了4通道的tensor,我们来看看深度可分离卷积是怎么实现通道的变化的。...

xu.hyj 1万+

RK3568下YT8531/YT8521 PHY移植避坑指南:RGMII与设备树详解

嵌入式Linux网络调试中,PHY芯片作为MAC与物理介质之间的桥梁,其驱动配置直接影响网络稳定性。RGMII接口的延时补偿、PHY地址设定以及复位时序是设备树配置中的关键环节,稍有差错便会出现链路已通却无法通信的现象。通过理解PHYLIB框架与mdio总线枚举原理,开发者可以快速定位寄存器级故障。在RK3568等工业级平台中,裕太微YT8531/YT8521凭借高性价比与内核主线支持,成为替代传统方案的热门选择。从设备树模板、内核配置到常见坑点,系统梳理千兆以太网PHY的移植与调试方法,帮助开发者少走弯路

weixin_29189381的博客 212

小米商城 -- vue项目实战

后端连接已不可用,该项目无效! 想看看前端代码还是可以接着阅读! github:小米商城源码 账号:sunyu 密码:123456 该项目是对小米商城系统的模仿,实现了从浏览商品到结算商品的整个过程,其中包括了商品列表、根据价格筛选商品、对商品 排序、登录、加入购物车、结算等功能 前台使用vue-cli构建了请求服务器,使用了Vue框架,还使用了vue-router...

七元八元 1万+

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,总算是跑通了。

/保存的文件个数这里之所以需要用到委托,直接更新textbox文本中的内容,以及复制picturebox的image会提示不是从齐创建的线程调用。

morsth的博客 4819

UniPic2-SD3.5M-Kontext-2B完全入门:这个单卡16GB就能跑的开源AI绘图+图像编辑模型,到底强在哪?

UniPic2-SD3.5M-Kontext-2B 是 Skywork 开源的一款轻量级 AI 绘图 + 图像编辑模型,基于 SD3.5-Medium 后训练而来,只需一张 16GB 消费级显卡就能流畅运行。它同时支持**文生图(Text-to-Image)**和**图像编辑(Image Editing)**两大核心能力,生成速度快、质量稳定,是目前低显存用户体验高质量绘图的优选方案之一。 ##

gitblog_00554的博客 401

STM32F103VCT6+W5500 TCP 服务端通信

STM32F103VCT6 W5500的TCP连接通讯的程序

坚韧与专注 7820

TensorRT量化校准数据集选择

在TensorRT中进行INT8量化时,校准数据集的选择至关重要,直接影响量化后模型的精度和推理性能。这是一个典型的问题。

浩瀚之水的专栏 499

Spark UI的54个组件怎么选?一张清单看懂全部动画UI组件

Spark UI 是一套面向 Vue 3 的**免费动画 UI 组件库**:官方收录 54 个动画 UI 组件,基于 TypeScript、Tailwind CSS 与 VueUse Motion 构建,主打"复制粘贴即可上线"。落地页缺一点高级感?这一篇分类清单帮你按场景快速选型。 ## 为什么新手适合 Spark UI 动画组件库 - ✅ **复制即用**:组件源码直接拷进你的 Vue 3

gitblog_00506的博客 433

手把手教你学Simulink——基于Simulink的固态变压器(SST)多级协同控制

摘要:本文详细介绍了基于Simulink的固态变压器(SST)多级协同控制方法。SST作为新一代智能电网核心设备,通过AC-DC整流、DC-DC隔离和DC-AC逆变三级架构实现电能高效转换。针对多级耦合难题,提出能量-功率协同控制策略:纵向解耦电压环与功率前馈,横向联动级间功率指令。在Simulink中搭建10kV/400V系统模型,实现直流母线电压波动<2%的动态性能。特别设计了负载突变时的三级协同机制,通过虚拟惯性算法和前馈控制实现快速响应。文章包含完整的建模步骤、控制推导和参数设置,为电力电子工

MHD0815的博客 195

GoFrame学习随便记5 (quasar)(待续)

另外,我们路径额外加一个/api前缀并在proxy重写规则中去掉,如果用根目录/,配置会复杂一些。使用相对路径后,代理proxy会过滤请求,对于匹配上的请求,进行代理转发,即请求不再是浏览器到后端服务器,变成前端服务器到后端服务器,这样就避开了跨域问题)创建页面 src/pages/PostPage.vue (复习一下 <script setup>语法糖,ref响应对象创建,生命周期钩子 onMounted,异步函数使用,quasar表格基本使用)layouts/MainLayout.vue,子组件包含。

sjg20010414的专栏 405

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

深入解析汉字动画库:从零到一的完整实战指南

Hanzi Writer 是一个功能强大的开源 JavaScript 库,专门用于显示汉字笔顺动画和创建汉字书写练习测验。该库支持简体和繁体汉字,为中文学习者提供了直观的汉字书写学习体验,帮助开发者快速集成汉字动画功能到各种教育应用中。 ## 项目背景与解决痛点 在中文教育技术领域,传统汉字教学面临着诸多挑战。学习者往往难以直观理解汉字笔顺规则,教师需要花费大量时间演示书写过程,而在线教育平台

gitblog_00974的博客 908

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【前端】项目中遇到的问题汇总(长期更新)

【长期更新】前端项目中常遇到的问题汇总(vue3+elementPlus+node.js+axios+webpack)

sinat_39394862的博客 1239

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

推荐优秀开源项目:Vue-Infinite-Scroll - 实现无限滚动效果的利器

推荐优秀开源项目:Vue-Infinite-Scroll - 实现无限滚动效果的利器 Vue-Infinite-Scroll 是一个由 ElemeFE 团队开发的 Vue.js 插件,主要用于在网页中实现流畅的无限滚动加载效果。作为一个高效、易用的组件,它极大地提升了用户的浏览体验,尤其适用于数据列表或网格视图等场景。让我们一起深入了解其核心功能和技术特性。 项目简介 Vue-Infinite-S...

gitblog_00100的博客 1761

小白入门---Vue无限滚动(vue-infinite-scroll)

Vue无限滚动(vue-infinite-scroll)1.安装插件 1.npm i vue-infinite-scroll –save:安装vue-infinite-scroll插件并且会将包的名称及版本号放在dependencies里面 2.D就是–save-dev 这样安装的包的名称及版本号就会存在package.json的devDependencies这个里面,而–save会将

Miss_wangdapao的博客 7575

vue滚动加载插件vue-infinite-scroll

vue-infinite-scroll插件可以无限滚动实现加载更多,其作用是是当滚动条滚动到距离底部的指定高度时触发某个方法。 https://github.com/ElemeFE/vue-infinite-scroll/ https://www.npmjs.com/package/vue-infinite-scroll 安装 cnpm i vue-infinite...

thatway的博客 2万+

Vue3 列表无限滚动vue3-infinite-scroll

vue-infinite-scroll的vue3版本,所有用法和一致。其代码也是基于它做了简单修改,并修复了一些bug,比如重复两次请求等问题。API参数 说明 类型 默认值。

最是人间留不住,朱颜辞镜花辞树。 1843

vue3+element-plus 通过v-infinite实现下拉滚动无限加载

Uncaught (in promise) TypeError: Cannot destructure property 'containerEl' of 'el[SCOPE]' as it is undefined.报错解决方法,vue3+element-plus 通过v-infinite实现下拉滚动无限加载

柑橘乌云_ 6936
上一篇: Vue3响应式原理简单实现
下一篇: vuex4+typescript实现智能提示
梅花十三儿
博客等级 码龄5年 1038粉丝 444原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值