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数字格式化通用类 accounting.js使用
Aug 24 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
Jan 17 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
Aug 12 Javascript
JS 在指定数组中随机取出N个不重复的数据
Jun 10 Javascript
JavaScript前端图片加载管理器imagepool使用详解
Dec 29 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
Aug 25 Javascript
Vue2.0 实现单选互斥的方法
Apr 13 Javascript
React性能优化系列之减少props改变的实现方法
Jan 17 Javascript
配置eslint规范项目代码风格
Mar 11 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
May 14 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
Sep 04 Javascript
微信小程序webSocket的使用方法
Feb 20 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环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
php实现快速排序法函数代码
2012/08/27 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
jquery动态添加option示例
2013/12/30 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
详解JavaScript编程中的数组结构
2015/10/24 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
ES5 ES6中Array对象去除重复项的方法总结
2017/04/27 Javascript
angular1配合gulp和bower的使用教程
2018/01/19 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
Python实现图片转字符画的示例
2017/08/22 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
征兵宣传标语
2014/06/20 职场文书
森林防火标语
2014/06/23 职场文书
会计专业自荐书
2014/07/08 职场文书
党的生日活动方案
2014/08/15 职场文书
给校长的一封检讨书
2014/09/20 职场文书
银行授权委托书格式
2014/10/10 职场文书
村干部任职承诺书
2015/01/21 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
实习报告范文
2019/07/30 职场文书
五年级作文之劳动作文
2019/11/12 职场文书