Vant-list源码详解

vue3 van-list van-pull-refresh实现上拉加载,下拉刷新 用于展示长列表,当列表即将滚动到底部时,会触发事件并加载更多列表项。用该组件可实现上拉加载。两个变量控制加载状态,当组件滚动到底部时,会触发 load 事件并将。事件,在事件的回调函数中可以进行同步或异步操作,操作完成后将。此时可以发起异步操作并更新数据,数据更新完毕后,将。若数据已全部加载完毕,则直接将。// 如果返回数据为空,表示已加载完成。 阅读详情

一、源码理解基础之scroll.js

1、1 >>> getScrollEventTarget

export default {
getScrollEventTarget(element, rootParent = window) {
    let currentNode = element;
    while (currentNode && currentNode.tagName !== 'HTML' && currentNode.tagName !== 'BODY' && currentNode.nodeType === 1 && currentNode !== rootParent) {
      const overflowY = this.getComputedStyle(currentNode).overflowY;
      if (overflowY === 'scroll' || overflowY === 'auto') {
        return currentNode;
      }
      currentNode = currentNode.parentNode;
    }
    return rootParent;
  }
}

getScrollEventTarget:

这个函数用于找到“目标容器”,即:有滚动条的dom。

 

1、2>>>  getScrollTop

 getScrollTop(element) {
    return 'scrollTop' in element ? element.scrollTop : element.pageYOffset;
  }

getScrollTop:

获取元素的滚动条高度。

Element.scrollTop 属性可以获取或设置一个元素的内容垂直滚动的像素数。

一个元素的 scrollTop 值是这个元素的顶部到它的最顶部可见内容(的顶部)的距离的度量。当一个元素的内容没有产生垂直方向的滚动条,那么它的 scrollTop 值为0。

 

1、3>>> getElementTop

 getElementTop(element) {
    return (element === window ? 0 : element.getBoundingClientRect().top) + this.getScrollTop(window);
  },

getElementTop:

元素顶部至页面顶部的距离

getBoundingClientRect用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。

 

1、4>>>  getVisibleHeight

  getVisibleHeight(element) {
    return element === window ? element.innerHeight : element.getBoundingClientRect().height;
  },

getVisibleHeight:

获取元素高度

 

二、源码理解之index.vue

重要源码部分

  methods: {
    check() {
      if (this.loading || this.finished) {
        return;
      }

      const el = this.$el;
      const { scroller } = this;
      // scrollerHeight 容器可见高度
      const scrollerHeight = utils.getVisibleHeight(scroller);

      /* istanbul ignore next */
      if (!scrollerHeight || utils.getComputedStyle(el).display === 'none' || el.offsetParent === null) {
        return;
      }
      // scrollTop滚动高度
      const scrollTop = utils.getScrollTop(scroller);
      const targetBottom = scrollTop + scrollerHeight;
      let reachBottom = false;
      /* istanbul ignore next */
      if (el === scroller) {
        reachBottom = scroller.scrollHeight - targetBottom < this.offset;
      } else {
        const elBottom =
          utils.getElementTop(el) -
          utils.getElementTop(scroller) +
          utils.getVisibleHeight(el);
        reachBottom = elBottom - scrollerHeight < this.offset;
      }

      /* istanbul ignore else */
      if (reachBottom) {
        this.$emit('input', true);
        this.$emit('load');
      }
    },

    handler(bind) {
      /* istanbul ignore else */
      if (this.binded !== bind) {
        this.binded = bind;
        (bind ? on : off)(this.scroller, 'scroll', this.check);
      }
    }
  }

最主要的方法是check()

重中之重是这段代码:

const elBottom =
          utils.getElementTop(el) -
          utils.getElementTop(scroller) +
          utils.getVisibleHeight(el);
        reachBottom = elBottom - scrollerHeight < this.offset;

下面我就来解释下这段代码的意思:

 看图一:

图一
图一

 这里用a来表示utils.getElementTop(el)    a=152   代表dom顶部距离page顶部的距离

b表示utils.getVisibleHeight(el)  b=800   代表dom的高度

d表示utils.getElementTop(scroller) 即滚动条的滚动的高度,此时没有滚动,即d=0

c表示scrollerHeight  即整个容器的高度

this.offset可以自定义设定

再来看图二:

图二

 

此时滚动条向下滚动了50

所以现在来看下

a=152

b=800

c=852

d=50

此时有变化的是utils.getElementTop(scroller)

如果我们设定this.offset=10

 reachBottom = elBottom - scrollerHeight < this.offset

                      =a-d+b-c=152-50+800-852=50 < 10

所以 reachBottom=false

所以 reachBottom还未达到触发滚动至底部加载新内容的条件

 

如果我们设定this.offset=55

reachBottom = 50 < 55 = true

所以此时可以触发加载新内容。

 

具体代码可以查看https://github.com/youzan/vant/tree/dev/packages/list、https://github.com/youzan/vant/tree/dev/packages/utils

【工作】van-list 分页查询数据切换页面后滑动位置保留 因为会多个请求,考虑可以一个请求,把分页参数pageSize修改为需要请求的数量。目前这样分页请求,会出现滑动停顿滑动停顿的反复,虽然loading展示,但是也可以看到这么一个交互。应用场景为从A页面点击到B页面,B页面操作后自动回到A页面,A页面滑动位置保留且对应项数据更新。2.在返回到A页面时,scroll有值,展示loading(要不然页面自己搜搜往下滑好奇怪)3.监听滑动,如果滑动高度curScroll与scroll相同,loading隐藏。数据是分页请求的,页面滑动也需要基于所有数据都拿到后。 阅读详情

相关推荐

Vue3 + Vant4实战:手把手教你解决下拉刷新与上拉加载的滚动条冲突问题

本文深度解析了在Vue3与Vant4项目中,van-pull-refresh下拉刷新与van-list上拉加载组件同时使用时,出现双滚动条冲突的根本原因。通过剖析滚动容器嵌套机制,重点介绍了利用List组件的`scroller`属性,提供了全局滚动与局部滚动两种主流解决方案,并附上完整代码与关键配置解析,帮助开发者彻底解决滚动监听困局,提升移动端列表交互体验。

t8u9v0的博客 709

vant之van-list的使用以及一些坑的解决方式

文章目录第一步,要使用vant组件,安装好vant,npm i vant -S第二步,在你要用到的地方js中引入,或者在src/main.js里面引入第三步,在template中引用第四步,js中重要代码第五步,解决遇到的坑 第一步,要使用vant组件,安装好vant,npm i vant -S 第二步,在你要用到的地方js中引入,或者在src/main.js里面引入 import Vue from ‘vue‘; import { List } from ‘vant‘; Vue.use(List); 这

rayong的博客 2万+

Vue+Vant+Koa+MongoDB实战:扫码点餐H5全栈系统

全栈开发是当前前端工程师技能拓展的重要方向,其核心在于前后端分离架构下,将UI交互、业务逻辑与数据存储高效串联。Vue作为主流的渐进式JavaScript框架,配合Vant移动端组件库,能快速构建体验流畅的H5界面;Koa凭借轻量的中间件洋葱模型,为后端接口提供了灵活的扩展能力;而MongoDB文档型的存储方式,则完美契合菜品、订单这类天然JSON化的业务数据。四者结合,构成了从页面渲染、接口响应到数据落地的完整闭环。在餐饮消费场景中,用户扫码点餐系统正是这一技术组合的典型落地应用——手机扫码进入H5页面,

weixin_33863087的博客 481

<van-list> </van-list>列表组件的使用

<template> <van-list v-model="loading" :finished="finished" finished-text="没有更多了" @load="onLoad"> <van-cell v-for="(item, index) in list" :key="index"> {{item}}} </van-cell> </van-list> </template> &l.

weixin_49577940的博客 7839

PyCharm+QT Designer整合

CMD下使用pip安装PyQt4或者PYQT5 这里要注意,你下载的PYQT5不包含QT designer 还要:pip3 install PyQt5-tools,好像Pyqt5中将designer分离了或者查看源码:https://github.com/altendky/pyqt5-tools,编译安装 将QT Designer整合到PyCharm的External Tools中,以后就可...

mxh的博客 6415

FDTD脚本教程——结构的创建

文章目录结构的搭建创建长方体创建柱体多边形柱体(椭)圆柱体圆环柱自定义形状创建surface波导球棱锥 在lumerical中,可以使用脚本进行操作,可在右侧脚本编辑器运行,或者直接在下方shell输入。 结构的搭建 创建长方体 um = 1e-6; nm = 1e-7; addrect; set("name","myRect"); set("material","SiO2 (Glass) - Palik"); set("render type","wireframe"); # 默认是细节渲染,也就是det

战斗果冻的训练中心 2万+

分析 vant4 源码,如何用 vue3 + ts 开发一个瀑布流滚动加载的列表组件?

2022年11月14日首发于掘金,现在同步到公众号。11. 前言大家好,我是若川。我倾力持续组织了一年多源码共读,感兴趣的可以加我微信 lxchuan12 参与。另外,想学源码,极力推荐关注我写的专栏《学习源码整体架构系列》,目前是掘金关注人数(4.6k+人)第一的专栏,写有20余篇源码文章。我们开发业务时经常会使用到组件库,一般来说,很多时候我们不需要关心内部实现。但是如果希望学习和深究里面的原...

u012384510的博客 2135

【技术纵览】行为识别前沿模型演进:从CNN到多模态大模型

本文全面解析了行为识别技术从CNN到多模态大模型的演进历程,重点介绍了SlowFast、TimeSformer、VideoMAE和InternVideo等SOTA模型的核心创新与应用实践。通过对比分析各代模型在Kinetics-400等数据集上的表现,揭示了自监督学习和多模态融合如何推动行为识别准确率突破85%,并探讨了工业部署中的技术选型策略与优化方向。

weixin_29169505的博客 155

Vant List 下拉加载避坑指南:从首次加载异常到多列表共存

本文详细解析了Vant List下拉加载的常见问题与解决方案,包括首次加载异常、重复加载和多列表共存等场景。重点介绍了immediate-check属性的正确用法,以及如何通过独立状态管理和通用加载方法优化性能。适用于Vue开发者快速解决Vant List组件在实际项目中的使用难题。

weixin_30673611的博客 239

手把手教你用STM32F103C8T6驱动HUB75 LED点阵屏(附74HC595级联代码)

本文详细介绍了如何使用STM32F103C8T6开发板驱动HUB75接口的LED点阵屏,包括硬件连接、74HC595级联代码、时序控制及灰度显示实现。通过实战案例展示动态文字显示和性能优化技巧,帮助开发者快速掌握LED点阵屏驱动技术。

weixin_42623010的博客 342

华为OD新系统机试真题 4.26 -最大化游戏试玩资格分发

华为OD机试新系统真题【最大化游戏试玩资格分发】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试 4月26号真题【最大化游戏试玩资格分发】。

qq_45776114的博客 831

Vue前端开发-Coupon组件

商品在展示时,通常会与一些优惠券一起显示,针对这种需求,Vant 提供了专门用于优惠券展示的组件——Coupon,它用于优惠券的兑换和选择,点击CouponCell组件时,以弹框形式进入选择,在选择时,由CouponList组件显示兑换优惠券列表,当选中某项列表后,再次返回CouponCell组件,显示选中项,并减少结算总金额。

762

知识图谱中的 Ontology(本体论)

1980年,本体论(Ontology)哲学概念“本体”被引入到人工智能领域用来刻画知识。本体概念模型、明确、形式化、共享。本体是实体存在形式的描述,往往表示为一组概念定义和概念之间的层级关系,本体框架形式树状结构,通常被用来为知识图谱定义schema。如人、公司、车等都可以在具体场景下称为本体。Ontology是(特定领域)信息组织的一种形式,是领域知识规范的抽象和描述,是表达、共享、重用知识的方法。Ontology。

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2034

Vant中List组件immediate-check=false无效的问题

使用vant中的List组件时,会有这样的场景 初始化时想自己触发列表查询,而不想触发 List 组件自带的 load 方法,这时可以设置 immediate-check=false,如下代码,但是这种方式会在下面的场景中出现问题 <van-list ref="vanlist" v-model="loading" :finished="finished" finished-text="已显示全部周报" :error.sync="error"

cry 4622

升级最新IDEA版本(2022.1.1)

升级最新IDEA版本(2022.1.1)

软件老王 3万+

【CloudCompare教程】017:点云快速全局配准

点云数据的配准分为基于特征(特征点、特征线)的拼接和无特征拼接。特征点匹配的方法和全局ICP的方法。特征点的方法通过全局特征匹配达到全局配准,全局ICP的方法通过对变量空间进行搜索的方法达到全局最优解。

智慧空间实验室 3931

Vant Weapp Uploader 文件上传组件完全指南:从基础用法到源码级原理

本文围绕 Vant Weapp 组件库中的 Uploader 文件上传组件展开,系统讲解其引入方式、基础用法、图片预览、上传状态管理、数量限制、自定义样式、上传前校验以及小程序云开发集成等完整实践,并结合仓库源码剖析其文件选择、类型识别、事件流转与尺寸控制等底层实现。读完本文,你将掌握在微信小程序中基于 `van-uploader` 构建完整文件上传交互的实战能力,同时理解该组件"选择与预览由组件

gitblog_00749的博客 401

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Vant Weapp Area 省市区选择组件:数据格式、联动原理与实战接入完整指南

Vant Weapp 的 Area 组件是一个开箱即用的省市区三级联动选择器,它基于 Picker 组件实现,通常与弹出层配合完成收货地址、证件归属地等场景的地址选择。本文将以 [packages/area/README.md](https://link.gitcode.com/i/c671bda0d838f23d6668078c12c8a4f6) 为骨架,结合 [packages/area/in

gitblog_00418的博客 420

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Vant Weapp Checkbox 复选框组件完全指南:从基础用法到组件组联动

本文围绕 Vant Weapp 小程序组件库中的 Checkbox 复选框组件展开,系统讲解单个复选框的引入、勾选状态绑定与外观定制,以及 CheckboxGroup 复选框组的多选联动、最大可选数限制与表单提交,并结合 [组件源码](https://link.gitcode.com/i/626c9daee8e2fcbeb7e965e14862f827) 与 [组件组源码](https://lin

gitblog_00794的博客 317

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[ vant ] vue移动端下拉刷新组件

vant 的下拉刷新组件和列表共用可能引起的滚动冲突

shaoyahu的博客 2267

Erlang List与字符串处理:RabbitMQ源码阅读必备基础

Erlang List作为函数式编程中的核心数据结构,其链表实现原理决定了头部操作高效、尾部追加需遍历的特性。在分布式系统开发中,List的模式匹配和高阶函数为消息处理、配置解析提供了强大的编程范式。列表推导式通过声明式语法实现数据转换与过滤,显著提升代码可读性。Erlang字符串本质是整数列表,虽统一了操作接口,但存在连接性能陷阱,而二进制字符串在IO密集型场景中更具优势。结合RabbitMQ源码实践,合理运用List与字符串处理技巧,能有效优化消息队列性能,避免常见内存泄漏问题。本文通过Erlang L

weixin_34413103的博客 498

vant 引进单个样式_vue 公共列表选择组件,引用Vant-UI的样式方式

此组件用于公共选择组件。引用Vant UI 作为样式特性:1、支持动态、静态数据源。2、支持分页加载。3、支持模糊搜索。4、支持单选、多选。组件源码:确认v-model="loading":finished="finished"finished-text="没有更多了"@load="filterSelectList">class="gn-cell"v-for="(item, index) i...

weixin_35835030的博客 568

小程序vant-weapp-商品卡片列表

用过小程序的几个框架,最后还是选择了用vant-weapp,喜欢这款框架的原因,可能就是它里面的组件很多,很丰富,够用,在我的业务场景里面,大部分的需求都是可以在这个框架里面找到,不用自己大费周章的写代码,只需要去文档里面,拿到组件出来,稍微的修改一下样式,就可以完成自己的工作,这大概就是它吸引我的地方啦。 当然选择要慎重哟,这个框架最适合的就是做商城项目购物车,订单,商品导航都是现成的呀 所以我...

祈澈菇凉 5385

vant里 List 组件可以与 PullRefresh 组件结合使用的一个小提示与小坑坑

小提示 List 组件可以与 PullRefresh 组件结合使用,可以实现列表下拉刷新的效果,但是当下拉刷新后更新的数据展示在页面上不能撑满 List 列表中的内容的时候,他并不会主动触发列表刷新,以至于来填满列表。 可以给list组件添加ref属性,然后在下拉刷新后,在下拉刷新的事件里手动调用this.$refs.listRef(你的list的ref名称).check()来触发列表加载后续的数据 // list组件 <van-list v-model="loading" ref

Aaa_Liao的博客 2236

Vant Weapp ActionSheet 动作面板组件完全指南:从基础用法到微信开放能力

底部弹起的模态面板是移动端交互中最常见的操作形式之一。Vant Weapp 的 ActionSheet(动作面板)组件围绕"选项列表 + 取消按钮 + 标题/描述"这一核心形态,提供了从基础渲染、状态控制到微信开放能力接入的完整能力。本文将以 [packages/action-sheet/README.md](https://link.gitcode.com/i/cae242d5126f47996

gitblog_01150的博客 442

vant 2.X列表请求多次的原因排查

vant

m0_48285782的博客 1119
上一篇: 修改复选框select的默认样式
下一篇: ERROR in Entry module not found: SyntaxError: C:\Users\Administrator\...编译出错(webpack)
github_turboemily
博客等级 码龄10年 16粉丝 40原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值