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 相关文章推荐
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
Jun 12 Javascript
javascript采用数组实现tab菜单切换效果
Dec 12 Javascript
Three.js源码阅读笔记(光照部分)
Dec 27 Javascript
JQuery 操作/获取table具体代码
Jun 13 Javascript
Google Maps API地图应用示例分享
Oct 23 Javascript
javascript获取当前鼠标坐标的方法
Jan 10 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
Jun 21 Javascript
详解Vue方法与事件
Mar 09 Javascript
JavaScript中数组常见操作技巧
Sep 01 Javascript
VueJs组件之父子通讯的方式
May 06 Javascript
React中使用UEditor百度富文本的方法
Aug 22 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 Vue.js
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中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
详解PHP中的PDO类
2015/07/06 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
2014/06/20 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
bootstrap datetimepicker2.3.11时间插件使用
2016/11/19 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
微信小程序开发技巧汇总
2019/07/15 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
2020/11/05 Javascript
用Python输出一个杨辉三角的例子
2014/06/13 Python
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
Python生成词云的实现代码
2020/01/14 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
Python使用Matlab命令过程解析
2020/06/04 Python
Python3获取cookie常用三种方案
2020/10/05 Python
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
竞选大队委员演讲稿
2014/04/28 职场文书
公开承诺书格式
2014/05/21 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
python自动化八大定位元素讲解
2021/07/09 Python