用Vue在移动端做滚动加载,使用mint-ui框架, InfiniteScroll指令loadmore组件,在uc浏览器和qq浏览器都无法触发。无奈我只能自己写了。

决定用vue 的自定义指令 写滚动加载。

核心的api

  • 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;

思路给window绑定滚动事件,用  if(滚动条高度 + 浏览器窗口高度 >= 内容高度 - 阈值)  作为判断条件。我们把自定义指令命名为 scroll

    directives: {
/**
* 滚动加载的自定义指令
*/
scroll: {
bind: function (el, binding, vnode) {
window.addEventListener('scroll', vnode.context.scrollLoad)
},
    //路由转跳到其他页面时,会调用unbind,解绑滚动加载事件。
unbind: function (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 - 50) {
//判断请求发送标志位,避免重复请求(这个需要自己在data里声明,直接贴代码会报错。默认为false,发送请求前改为true, 请求完成回调函数里改回false)
if (this.loading) return;
//发送请求
this.getnewsData();
},
getnewsData() {/*发送请求的函数*/}
},

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

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

使用 时,因为基于文档高度和滚动条高度,绑在哪里无所谓,这里绑定到容器上就可以了。

<template>
<section v-scroll>
<ul>
<template v-for="data in datas">
<li>
..........
</li>
</template>
</ul>
</section>
</template>

以上内容,转载请注明出处 https://www.cnblogs.com/lijinwen/p/8444400.html

最新文章

  1. cookies插件,记住cookies
  2. manachor
  3. String类和StringBuffer类的区别
  4. [题解]poj 1274 The Perfect Stall(网络流)
  5. Android中的进程与线程
  6. android网络请求之get方法
  7. 【转】Error: no `server&#39; JVM at `C:\Program Files\Java\jre6\bin\server\jvm.dll&#39;.解决办法
  8. C# The process cannot access the file because it is being used by another process
  9. MongoDB详解学习历程
  10. SqlServer拆分列
  11. RabbitMQ系列教程之四:路由(Routing)
  12. 前端之DOM操作
  13. Failed to initialize component [org.apache.catalina.webresources.JarResource
  14. span i s等行内元素标签之间出现奇怪空格符号
  15. CAS 单点登录【2】自定义用户验证
  16. IIS发布网站遇到 编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary 编
  17. Asp.net中文本框全选的实现
  18. RestTemplate中文乱码问题(spring-web3.0.7版本)
  19. 在eclipse中使用github进行代码的上传操作以及如何建立分支
  20. GO学习笔记 - map

热门文章

  1. Code Signal_练习题_All Longest Strings
  2. 51Nod1584 加权约数和
  3. THUSC2017 游记
  4. gulp入门实践
  5. 线上Bug修复流程
  6. Chrome浏览器取消INPUT自动记忆下拉框
  7. hue简单介绍
  8. 单机安装hive和presto
  9. top,job,user,file,alias
  10. .net验证是否合法邮箱和ip地址的方式