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 相关文章推荐
showModalDialog 和 showModelessDialog
Jan 22 Javascript
详解JavaScript中循环控制语句的用法
Jun 03 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
May 08 jQuery
JavaScript实现的贝塞尔曲线算法简单示例
Jan 30 Javascript
详解使用Next.js构建服务端渲染应用
Jul 10 Javascript
详解微信小程序实现WebSocket心跳重连
Jul 31 Javascript
通过jQuery学习js类型判断的技巧
May 27 jQuery
js+canvas实现两张图片合并成一张图片的方法
Nov 01 Javascript
原生js实现轮播图特效
May 04 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
Aug 06 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
Sep 17 Javascript
详解vue 组件的实现原理
Nov 12 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 Sql Server连接失败问题及解决办法
2009/08/07 PHP
php中判断数组是一维,二维,还是多维的解决方法
2013/05/04 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
Extjs中常用表单介绍与应用
2010/06/07 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
Javascript的动态增加类的实现方法
2016/10/20 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
vue中watch和computed的区别与使用方法
2020/08/23 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
wxpython 学习笔记 第一天
2009/02/09 Python
Python yield 使用浅析
2015/05/28 Python
使用numba对Python运算加速的方法
2018/10/15 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
python爬虫 线程池创建并获取文件代码实例
2019/09/28 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
Python 如何创建一个线程池
2020/07/28 Python
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
2015年五一劳动节慰问信
2015/03/23 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL
Pygame Rect区域位置的使用(图文)
2021/11/17 Python