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 相关文章推荐
一个js封装的不错的选项卡效果代码
Feb 15 Javascript
基于jquery封装的一个js分页
Nov 15 Javascript
asp.net中System.Timers.Timer的使用方法
Mar 20 Javascript
jquery实现页面常用的返回顶部效果
Mar 04 Javascript
jquery ajax局部加载方法详解(实现代码)
May 12 Javascript
微信小程序 网络请求(post请求,get请求)
Jan 17 Javascript
JS实现汉字与Unicode码相互转换的方法详解
Apr 28 Javascript
解决vue router使用 history 模式刷新后404问题
Jul 19 Javascript
利用vue + element实现表格分页和前端搜索的方法
Dec 25 Javascript
koa2 从入门到精通(小结)
Jul 23 Javascript
微信小程序实现蒙版弹出窗功能
Sep 17 Javascript
JS中的模糊查询功能
Dec 08 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得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
Google 静态地图API实现代码
2010/11/19 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
DIV+CSS+jQ实现省市联动可扩展
2016/06/22 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
ES5 ES6中Array对象去除重复项的方法总结
2017/04/27 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
Python访问MySQL封装的常用类实例
2014/11/11 Python
基于Python对象引用、可变性和垃圾回收详解
2017/08/21 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
python list元素为tuple时的排序方法
2018/04/18 Python
有关Python的22个编程技巧
2018/08/29 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
幼儿园教师培训方案
2014/02/04 职场文书
医院搬迁方案
2014/06/14 职场文书
英文慰问信
2015/02/14 职场文书
答谢酒会主持词
2015/07/02 职场文书
热爱劳动主题班会
2015/08/14 职场文书
2016特色励志班级口号
2015/12/24 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
python 三边测量定位的实现代码
2021/04/22 Python