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 多种变量定义(对象直接量,数组直接量和函数直接量)
May 24 Javascript
js获取当前日期时间及其它操作汇总
Apr 17 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
Aug 04 Javascript
解决拦截器对ajax请求的拦截实例详解
Dec 21 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
Jan 16 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
Feb 18 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
Sep 21 Javascript
vue.js的状态管理vuex中store的使用详解
Nov 08 Javascript
Vue.js实现可编辑的表格
Dec 11 Javascript
Vue插件之滑动验证码用法详解
Apr 05 Javascript
js实现表格单列按字母排序
Aug 12 Javascript
原生js实现下拉框选择组件
Jan 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字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
python处理csv数据的方法
2015/03/11 Python
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
Under Armour美国官网:美国知名高端功能性运动品牌
2016/09/05 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
幼儿园保育员辞职信
2014/01/12 职场文书
2014年上半年工作自我评价
2014/01/18 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
社区网格化管理实施方案
2014/03/21 职场文书
运动会口号8字
2014/06/07 职场文书
节能环保口号
2014/06/12 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
航班延误投诉信
2015/07/02 职场文书
同事离别感言
2015/08/04 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android