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中也使用$美元符号来代替document.getElementById
Jun 19 Javascript
jQuery之ajax删除详解
Feb 27 Javascript
js模拟C#中List的简单实例
Mar 06 Javascript
javascript 获取元素样式必杀技
May 04 Javascript
纯Javascript实现ping功能的方法
Mar 20 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
Dec 31 Javascript
jQuery实现搜索页面关键字的功能
Feb 16 Javascript
JS及JQuery对Html内容编码,Html转义
Feb 17 Javascript
jquery仿微信聊天界面
May 06 jQuery
一个有意思的鼠标点击文字特效jquery代码
Sep 23 jQuery
H5实现仿flash效果的实现代码
Sep 29 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
Nov 13 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
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
php设计模式 Factory(工厂模式)
2011/06/26 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
Javascript实现div的toggle效果实例分析
2015/06/09 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
深入浅出es6模板字符串
2017/08/26 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
Python Subprocess模块原理及实例
2019/08/26 Python
关于Python解包知识点总结
2020/05/05 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
Python爬虫开发与项目实战
2020/12/16 Python
中学生自我评价范文
2014/02/08 职场文书
诚信贷款承诺书
2014/05/30 职场文书
推普周活动总结
2014/08/28 职场文书
二人合伙经营协议书
2014/09/13 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python
Mysql调整优化之四种分区方式以及组合分区
2022/04/13 MySQL