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 相关文章推荐
?牟┛途W扣了一??效果出?? target=
May 27 Javascript
jQuery 数据缓存模块进化史详细介绍
Nov 19 Javascript
JS打印gridview实现原理及代码
Feb 05 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
Sep 26 Javascript
页面刷新时记住滚动条的位置jquery代码
Jun 17 Javascript
探讨JavaScript语句的执行过程
Jan 28 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
Jan 19 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
Sep 27 Javascript
JavaScript自执行函数和jQuery扩展方法详解
Oct 27 jQuery
web前端vue之CSS过渡效果示例
Jan 10 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
Sep 14 Javascript
JS实现无限轮播无倒退效果
Sep 21 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
PHP4中实现动态代理
2006/10/09 PHP
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
ScrollDown的基本操作示例
2013/06/09 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
如何使用JS在HTML中自定义字符串格式化
2017/07/20 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
Python写的贪吃蛇游戏例子
2014/06/16 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
有趣的python小程序分享
2017/12/05 Python
python使用KNN算法手写体识别
2018/02/01 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
竞聘演讲稿范文
2014/01/12 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
《颐和园》教学反思
2016/02/19 职场文书
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS