Vue滚动加载自定义指令
用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实例,而是通过指令钩子函数的第三个参数vnode的context属性拿
必须要在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
Vue滚动加载自定义指令的更多相关文章
- 笔记-VUE滚动加载更多数据
来源:https://blog.csdn.net/qq_17281881/article/details/87342403 VUE滚动加载更多数据 data() { return { loading: ...
- vue 滚动加载
<template> <div class="wraper" @scroll="onScroll($event)"> <div c ...
- vue 滚动加载数据
参考链接:https://www.npmjs.com/package/vue-infinite-scroll
- 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多
通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...
- Angular: 使用 RxJS Observables 来实现简易版的无限滚动加载指令
我使用 angular-cli 来搭建项目. ng new infinite-scroller-poc --style=scss 项目生成好后,进入 infinite-scroller-poc 目录下 ...
- vue 原生添加滚动加载更多
vue中添加滚动加载更多,因为是单页面所以需要在跳出页面时候销毁滚动,要不会出现错乱.我们在mounted建立滚动,destroyed销毁滚动. mounted () { window.addEven ...
- 关于Vue+iview的简单下拉框滚动加载
话不多说,直接上代码,作用是下拉框内容无限滚动加载: Html: <FormItem style="position:relative" label="用户名:&q ...
- Vue无限滚动加载数据
Web项目经常会用到下拉滚动加载数据的功能,今天就来种草Vue-infinite-loading 这个插件,讲解一下使用方法! 第一步:安装 npm install vue-infinite-load ...
- 在element-ui的select下拉框加上滚动加载
在项目中,我们需要运用到很多来自后端返回的数据.有时是上百条,有时甚至上千条.如果加上后端的多表查询或者数据量过大,这就导致在前端的显示就会及其慢,特别是在网络不好的时候更是如此. 自然,后端就做了一 ...
随机推荐
- Java - String, Stringbuilder, StringBuffer比较
http://www.cnblogs.com/zuoxiaolong/p/lang1.html
- Form表单中Post与Get方法的区别
Form提供了两种数据传输的方式:get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响. Form中的get和post方法,在数据传输过程中分别 ...
- Python 两个list合并成一个字典
方法一:list1 = ['k1','k2','k3'] list2 = ['v1','v2','v3'] dic = dict(map(lambda x,y:[x,y],list1,list2)) ...
- CodeForces762A
A. k-th divisor time limit per test:2 seconds memory limit per test:256 megabytes input:standard inp ...
- YII使用beanstalk队列
转载于:http://blog.csdn.net/yao970953039/article/details/41821387 1.系统centos 我是直接使用yum install beanstal ...
- A Complete Tutorial to Learn Data Science with Python from Scratch
A Complete Tutorial to Learn Data Science with Python from Scratch Introduction It happened few year ...
- python的学习笔记之——time模块常用内置函数
1.Python time time()方法 Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数). time()方法语法: time.time() 举例: #! ...
- 【Python】Java程序员学习Python(一)— 为什么学习Python
现在是6月份,毕业快3年了,虽然不能说对Java掌握的程度达到了如火纯青的地步,但是依然感觉到了瓶颈期,Java用的多了,也到了随心所欲的地步了,所以学第二门语言的想法一直在我脑海里闪现,有想法了就要 ...
- mocha、chai、sinon和istanbul实现100%单元测试覆盖率
敏捷软件开发中,最重要实践的就是测试驱动开发,在单元测试层面,我们试着实现一个重要的指标就是测试覆盖率.测试覆盖率衡量我们的代码是否已经全部被测试到了. 但是指标本身不是目的,借助测试覆盖率检查,我们 ...
- mysql group replication观点及实践
一:个人看法 Mysql Group Replication 随着5.7发布3年了.作为技术爱好者.mgr 是继 oracle database rac 之后. 又一个“真正” 的群集,怎么做到“ ...