vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法详解


Posted in Javascript onOctober 15, 2019

本文实例讲述了vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法。分享给大家供大家参考,具体如下:

在网上看了一下vue中监听滚动条滚动事件,清一色的使用document.addEventListener('scroll',function(){})

我是在做滚动条滑到底部时,自动加载更多的时候有这个需求。

我认为使用document.addEventListener会破坏vue的统一性,对我这种有轻微代码强迫症的人来说,让我感觉很不爽。而且这种做法,会让你更加难以判断是否滑动到底部了,特别是当你并不是整页滚动,而是页面中拥有一个fixed固定的头部时。

在.vue的组件中

<template>
 <div class="body-container" @scroll="scrollEvent">
 <ul>
 <li></li>
 ……
 <li></li>
 </ul>
 </div>
<template>
export default {
 name: 'demo',
 data () {
  return {
  msg: '',
  }
 },
 methods: {
  scrollEvent(e){
  console.log(e)
  },
 }
}

照上面的写法,我发现即使我的li标签足够多,撑满一页,页面滚动的时候并不能触发到scrollEvent,是什么原因呢?

经过仔细思考,猜想应该是滚动事件并不是在我<div class="body-container" @scroll="scrollEvent">这个div上触发的,因为滚动条并没有出现在我这个div上。这个div完全被li标签撑起来了,产生滚动事件的就是document了。

于是做了一个小试验,定义一个固定高度的div

<div style="height: 300px" @scroll="scrollEvent">
 <div style="height: 200px"></div>
 <div style="height: 200px"></div>
 <div style="height: 200px"></div>
</div>

当我在这个300px固定高度的div中滚动的时候,果然触发了scrollEvent,问题原因找到了,接下来就是解决了。

只要我能让<div class="body-container" @scroll="scrollEvent">拥有固定高度,就能触发滚动事件了。

但是固定高度怎么给呢,各个厂商的手机屏幕高度都是不一样的,总不能让某些手机显示不完全,或者底部留空白吧。

当然后办法啦!就是吧html,body,.body-container{height:100%}这样,我的.body-container就能继承到document的高度了;

还有另一个办法,让.body-container使用fixed定位

.body-container{
 position: fixed;
 top:6rem;
 left: 0;
 right:0;
 bottom: 0;
 overflow: auto
}

因为上下左右的位置都固定了,所以div自然也就有了固定高度,此方法适用于页面有一个固定高度的头部导航,我项目中有一个6rem高的头部导航,所以我采用了fixed定位。

接下来就是验证是否滑到了底部

export default {
 name: 'demo',
 data () {
  return {
  msg: '',
  }
 },
 methods: {
  scroll(e){
  //滚动的像素+容器的高度>可滚动的总高度-100像素
  if(e.srcElement.scrollTop+e.srcElement.offsetHeight>e.srcElement.scrollHeight-100){
   this.loadMore(); //加载更多
  }
  },
 }
}

这样就能比较清晰的判断是否滚动到了底部。但是如果仅仅这样写,当滚动到底部100px内时,会触发很多次加载更多,所以我们需要增加一些判断条件

methods: {
  scroll(e){
  // !this.moreLoading 没有在加载状态,触发加载更多时,把this.moreLoading置未true
  // !this.noMore 没有更多的状态为false,当我们取到的数据长度小于1页的数量时,就没有更多了数据了,把 this.noMore置为true,这样就不会触发无意义的加载更多了
  if(e.srcElement.scrollTop+e.srcElement.offsetHeight>e.srcElement.scrollHeight-100 && !this.moreLoading && !this.noMore){
   this.loadMore();
  }
  },
 }

至此,功能完美的实现了,而且没有使用document.addEventListener破坏vue的完整性,感觉自己棒棒哒!

希望本文所述对大家vue.js程序设计有所帮助。

Javascript 相关文章推荐
javascript new后的constructor属性
Aug 05 Javascript
JavaScript类和继承 prototype属性
Sep 03 Javascript
JavaScript类和继承 this属性使用说明
Sep 03 Javascript
js获得地址栏?问号后参数的方法
Aug 08 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
Dec 19 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
Jun 17 Javascript
AngularJs自定义服务之实现签名和加密
Aug 02 Javascript
Bootstrap源码解读网格系统(3)
Dec 22 Javascript
vue综合组件间的通信详解
Nov 06 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
Dec 09 Javascript
jQuery实现手风琴特效
Jan 11 jQuery
js实现简单图片拖拽效果
Feb 22 Javascript
vue实现树形结构样式和功能的实例代码
Oct 15 #Javascript
谈谈IntersectionObserver懒加载的具体使用
Oct 15 #Javascript
js实现开关灯效果
Mar 30 #Javascript
JS实现灯泡开关特效
Mar 30 #Javascript
浅谈微信小程序列表埋点曝光指南
Oct 15 #Javascript
javascript网页随机点名实现过程解析
Oct 15 #Javascript
javascript随机变色实例代码
Oct 15 #Javascript
You might like
基于PHP编程注意事项的小结
2013/04/27 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
Python中关键字is与==的区别简述
2014/07/31 Python
python构建自定义回调函数详解
2017/06/20 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
python实现中文文本分句的例子
2019/07/15 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
JD Sports比利时官网:英国领先的运动鞋和运动服饰零售商
2018/10/10 全球购物
澳大利亚家具商店:Freedom
2020/12/17 全球购物
小学三年级学生评语
2014/04/22 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
安全宣传标语口号
2014/06/06 职场文书
七一建党日演讲稿
2014/09/05 职场文书
解放思想大讨论活动心得体会
2014/09/11 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
酒会开场白大全
2015/06/01 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android
如何利用python实现列表嵌套字典取值
2022/06/10 Python