版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第vue前端框架vueuse的useScroll函数使用源码分析目录引言1.示例2.源码解析2.1参数解析2.2响应式状态定义2.3onScrollEnd滚动结束回调2.4onScrollHandler滚动处理2.5使用useEventListener监听滚动事件2.6返回值3.总结
引言
页面很多时候都含有可滚动视图区域,可能是横向滚动也可能是纵向滚动。
有时我们需要知道当前的滚动方向,是向左还是向右,是向上还是向下;有时需要知道当前是否是正在滚动,如果滚动则显示一个加载动画等;有时我们还需要知道滚动条是否已经滚动到了上下左右的边界。
如果我们自己来实现这一系列的逻辑判断可能也不难,但是如何优雅地实现以便于更方便地使用呢?一起研究一下vueuse的useScroll函数吧~
1.示例
vueuse官方文档给出了useScroll函数的demo,我们可以在线操作看一下效果:
如上图所示,当向下滑动或者拖拽竖直方向的滚动条时则isScrolling为true表示正在向下滚动,同时useScroll能够识别出滚动方向为向下。
如上图所示,当滚动条触底的时候,useScroll能够识别出已经到达了底部。
useScroll为何如此好用,是如何实现的呢?我们一同学习其源码。
2.源码解析
先看折叠后的代码整体了解一下:
我们发现整个代码流程包括了参数的解析,状态的定义,滚动结束回调函数,滚动监听处理函数,最后是返回值,我们依次来看一下。
2.1参数解析
const{
throttle=0,
idle=200,
onStop=noop,
onScroll=noop,
offset={
left:0,
right:0,
top:0,
bottom:0,
eventListenerOptions={
capture:false,
passive:true,
}=options
useScroll接受两个参数,第一参数为目标元素,也就是监听哪一个元素的滚动事件;第二个参数为options,涵盖其他的选项。我们来详细地看一下这些选项的含义:
throttle滚动事件的节流事件,默认不对滚动事件节流,所以throttle的默认值为0。idle滚动结束时的检查事件,这个值会和throttle加在一起对滚动结束事件进行防抖,分析后面的代码时会看到onStop滚动结束时触发的回调函数onScroll滚动时触发的回调函数offset定义滚动条到达上下左右边界的一个偏移值,单位为像素。例如left设置为30,则水平滚动条距离左边界30px时则认为到达了左边界。eventListenerOptions滚动事件监听器的选项
2.2响应式状态定义
constx=ref(0)
consty=ref(0)
constisScrolling=ref(false)
constarrivedState=reactive({
left:true,
right:false,
top:true,
bottom:false,
constdirections=reactive({
left:false,
right:false,
top:false,
bottom:false,
定义响应式变量x用于记录上次滚动的scrollLeft的值;
y记录上次滚动的scrollTop的值;
isScrolling表示是否正在滚动。
arrivedState提供了水平方向滚动条距离左边和右边的距离以及垂直方向滚动条距离上边和下边的距离。
directions用于描述当前滚动的方向。
2.3onScrollEnd滚动结束回调
constonScrollEnd=useDebounceFn((e:Event)={
isScrolling.value=false
directions.left=false
directions.right=false
directions.top=false
directions.bottom=false
onStop(e)
},throttle+idle)
滚动结束回调函数使用了useDebounceFn进行防抖。当滚动结束后,isScrolling赋值为false,滚动方向全部赋值为false,调用onStop回调。
2.4onScrollHandler滚动处理
constonScrollHandler=(e:Event)={
consteventTarget=(
e.target===document(e.targetasDocument).documentElement:e.target
)asHTMLElement
constscrollLeft=eventTarget.scrollLeft
directions.left=scrollLeftx.value
directions.right=scrollLeftx.value
arrivedState.left=scrollLeft=0+(offset.left||0)
arrivedState.right
=scrollLeft+eventTarget.clientWidth=eventTarget.scrollWidth-(offset.right||0)
x.value=scrollLeft
letscrollTop=eventTarget.scrollTop
//patchformobilecompatible
if(e.target===document!scrollTop)
scrollTop=document.body.scrollTop
directions.top=scrollTopy.value
directions.bottom=scrollTopy.value
arrivedState.top=scrollTop=0+(offset.top||0)
arrivedState.bottom
=scrollTop+eventTarget.clientHeight=eventTarget.scrollHeight-(offset.bottom||0)
y.value=scrollTop
isScrolling.value=true
onScrollEnd(e)
onScroll(e)
onScrollHandler用于处理滚动。首先是水平方向滚动方向与是否到达左右边界的判断。说明如下:
(1)获取当前的scrollLeft和上一次的scrollLeft也就是x.value进行比较,如果scrollLeftx.value说明向左滚动,否则向右滚动。
(2)如何判断是否到达左边界?这里考虑到了偏移量offset.left。如果当前的scrollLeft=offset.left就认为到达了左边界。
(3)是否到达右边界要看当前滚动的距离+元素视口的宽度(clientWidth)是否大于整个内容的宽度(scrollWidth)减去偏移量的值(offset.right)
竖直方向的判断同理,不再赘述,如果您不熟悉clientWidth、scrollWidth的含义,您可以阅读笔者之前的文章:scrollTop、clientHeight、scrollHeight...学完真的理解了。
滚动的时候还需要调用onScrollEnd触发滚动结束事件,调用onScroll回调函数,将isScrolling设置为true。
2.5使用useEventListener监听滚动事件
useEventListener(
element,
'scroll',
throttleuseThrottleFn(onScrollHandler,throttle):onScrollHandler,
eventListenerOptions,
使用useEventListener监听scroll事件,如果需要节流则回调函数为useThrottleFn包装过的onScrollHandler,否则直接使用onScrollHandler。
2.6返回值
return{
isScrolling,
arrivedState,
directions,
useScroll最后返回响应式状态。我们使用一张图总结一下这些状态:
3.总结
useScroll提供了响应式的滚动位置和状态。滚动位置包括水平方向和垂直方向的滚动位置;滚动状态包括是否在滚动,是否到达了上下左右的边
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《人工智能技术与应用》 课件 第5、6章 AI智能体与自动化、AI创新项目
- 质量信得过班组创建总结
- 爱普生机械手入门精讲
- 纠正心肌能量代谢异常全面优化PCI治疗
- 湘教版高中生物选修一生物与法律单元测试卷及答案
- 人教版高中英语第2章写作技巧练习题及答案
- 2026秋小学苏教版科学二年级上册第一单元学情测试练习卷及参考答案三套
- 现代加工技术10化学加工
- 淋巴细胞系形态识别
- 电子执照业务介绍课件
- 专科专病数字化管理平台建设方案
- 2025浦发银行校招笔试真题及答案
- 2025年医疗部门患者护理工作手册
- 2026年保安员资格考试题库(含参考答案)
- 2026年职业卫生健康考试题库(附答案)
- 主体劳务扩大清包合同9篇
- 2026新教材数学 3.2 练习八九十教学课件2026-2027学年人教版四年级数学上册
- 第二单元《学习项目二 一首作品旅途中的伙伴》课件-2026-2027学年人教版(简谱)(新教材)初中音乐九年级上册
- 2026年秋季高三年级青年班主任工作汇报课件:班主任工作的道与术
- 【方案】2026算电协同(智算中心)技术方案
- CSCO前列腺癌诊疗指南(2026版)
评论
0/150
提交评论