这几天在做商城首页的商品列表,商品卡片的数量很多,如果一次性加载那么多,加载较慢,而且用户体验不好。所以使用鼠标无限滚动加载效果更好。 实现滚动加载的方式有很多,有现成的组件 InfiniteScroll,但是一些非主流浏览器无法触发,还是自己动手写一写吧。

实现滚动加载的核心:滚动条高度 + 浏览器窗口高度 >= 内容高度 - 阈值

  • document.body.scrollTop 滚动条滚动的距离 (这个有兼容性问题,兼容性写法)
    let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
  • window.innerHeight 浏览器窗口高度
  • document.body.scrollHeight 内容高度 (兼容性写法)
    let bodyHeight = document.body.scrollHeight || document.documentElement.scrollHeight;
  1. 自定义指令 v-scroll
directives: {/*** 滚动加载的自定义指令*/scroll: {bind(el, binding, vnode) {window.addEventListener('scroll', vnode.context.scrollLoad)},unbind(el, binding, vnode) {window.removeEventListener('scroll', vnode.context.scrollLoad)}}
},
methods: {scrollLoad() {//滚动条高度(页面被卷去高度)let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;//文档高度let bodyHeight = document.body.scrollHeight || document.documentElement.scrollHeight;// 滚动条高度 + 浏览器高度 >= 文档高度 - 阈值if (scrollTop + window.innerHeight >= bodyHeight - 300) {// 判断请求发送标志位,避免重复请求if (this.loading) return;// 加载的页码和每次滚动加载的数量,中data中声明if (this.listIndex * this.PageQty >= this.total) return;this.listIndex++// 获取商品数据的异步操作this.getProductList(this.listIndex)}}
}
复制代码

这里需要注意:

  1. 因为发送请求和滚动事件的方法定义在了组件的 methods中,需要拿到Vue实例,但在自定义指令里,不能通过 this 拿到Vue实例,而是通过指令钩子函数的第三个参数 vnodecontext 属性拿

  2. 必须要在unbind钩子中解绑滚动加载事件,否则在其他页面也会被触发。

使用时,因为基于文档高度和滚动条高度,绑在哪里无所谓。

<template><div id="index" v-scroll><ul><li v-for="(item, index) in productList" :key="index"></li></ul></div>
</template>
复制代码

转载于:https://juejin.im/post/5d0b56b1e51d45775f516a74

Vue踩坑之旅(四)—— 自定义指令实现滚动加载相关推荐

  1. Vue踩坑日记: history路由打包后无法加载

    前言: 在使用Vue框架时避免不了会使用到vue-router工具,Vue-router提供了Hash和History两种路由模式.默认为Hash模式,但此模式下URL中会存在 "#&quo ...

  2. Vue踩坑之旅(一)—— 数组、对象的监听

    作为一个接触 vue 才一个多月的小白,马上就接手基于 vue 的大型商城项目,其间真是跌跌撞撞踩了好多坑(o(╥﹏╥)o).在此写下自己的踩坑之旅,希望给跟我一样还在自学 vue 的同学一些帮助,另 ...

  3. 【vue】用WOW.js+animate.css实现页面滚动加载元素动画

    一.场景 在很多的网站中,我们发现在滚动条滑动的时候一些元素显示出来的时候是有一些动画效果的,这样看起来页面更具有活力,增加用户体验.当然这些动画我们可以通过判断滚动条的位置或者判断元素距离可视窗口的 ...

  4. vue+element实现Select 选择器的远程搜索、滚动加载

    1.html结构: <el-selectv-model.trim="query.enEnterpriseBaseId"v-loadmore="loadMore&qu ...

  5. Vue 踩坑之旅(1)

    关于使用es6的export  import 我们使用export import 来实现js方法的数据输出和接受,在一个我们需要对外输出的js方法中,我们使用 export 来实现方法的对外输出, 1 ...

  6. spring boot 踩坑日记: 错误: 找不到或无法加载主类 xxx.xxx.xxx

    错误信息: 错误: 找不到或无法加载主类 io.sr.SrDhTraApplication 解决: 在pom.xm文件中指明启动类位置: 代码: <configuration><fo ...

  7. OrangePi PC 玩Linux主线内核踩坑之旅(四)之变身MP3播放器

    主线内核Linux跑起来后,我们就可以用香橙派做一些简单的应用了.既然是简单的应用,那便是说基本上无需再添加额外的硬件即可实现相应的功能,"变身MP3播放器"便是一例.当然,耳机或 ...

  8. python 同花顺thstrader_Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)...

    代码示例支持 平台: Centos 6.3 Python: 2.7.14 1.1 踩坑案例 pid, ppid是大家比较常见的术语, 代表进程号,父进程号. 但pgid是个什么鬼? 了解pgid之前, ...

  9. Vue 爬坑之旅 -- 微信网页授权

    现在的 H5 开发,微信授权和微信分享基本是必备功能,昨天将微信分享的相关功能和踩坑过程做了一个总结,今天就来说下微信授权的功能具体到 vue 项目中该要怎么做. Vue 爬坑之旅 – history ...

最新文章

  1. python 多维 条件获取
  2. BZOJ3832 [Poi2014]Rally 【拓扑序 + 堆】
  3. php下字符与二进制互转函数,PHP 字符串与二进制互转
  4. Datatable Initialization - 使用objects数据源初始化
  5. RFileWriteStream 写入汉字
  6. 用户zabbix@localhost的访问被拒绝(使用密码:yes)_Coinbase意外地保存了3420个客户的未加密密码...
  7. Linux 内核的壳 —— shell
  8. 《21天学通Java(第6版)》—— 1.2 面向对象编程
  9. 如何用计算机制作pop海报,怎么用ps制作pop海报_ps制作pop字体
  10. ubuntu 14.04安装flash播放器
  11. html5禁用右侧滚轮条,鼠标滚轮终于不乱跳了,自己动手更换鼠标滚轮编码器 雷柏7100=================...
  12. 通向架构师的道路(第三天)之apache性能调优 (转)
  13. 2.大型网站架构演化的价值观
  14. 怎么把线稿提取出来_如何利用PS提取图片线稿?
  15. html个人中心布局,html5前端开发笔记-个人中心
  16. 中文乱码字幕视频观看的免费网站
  17. python自学,这几个网站就够了
  18. android 电视分享,Android系统电视去广告2.1
  19. 【软工文档】机房收费系统之软件需求说明书
  20. aws ec2 linux 密码,AWS EC2实例Ubuntu系统设置root用户密码并使用root/ubuntu用户登录

热门文章

  1. 谷歌Android无障碍套件,谷歌为无障碍套件添加盲文键盘:无需额外硬件就能打字...
  2. springmvc rest风格化案例
  3. Oracle第三课之PLSQL
  4. tomcat端口冲突解决 Address already in use: JVM_Bind :8080
  5. c++中判断某个值在字典的value中_Python核心知识系列:字典
  6. Python装饰器学习(九步入门)
  7. 生命的力量:萝卜开花
  8. R绘图 vs Python绘图(散点图、折线图、直方图、条形图、箱线图、饼图、热力图、蜘蛛图)
  9. 剑指offer 数值的整次方
  10. Bigo 实时计算平台建设实践