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下拉框加上滚动加载
在项目中,我们需要运用到很多来自后端返回的数据.有时是上百条,有时甚至上千条.如果加上后端的多表查询或者数据量过大,这就导致在前端的显示就会及其慢,特别是在网络不好的时候更是如此. 自然,后端就做了一 ...
随机推荐
- SpringMVC接受请求参数、
1. 接收请求参数 1.1. [不推荐]通过HttpServletRequest 在处理请求的方法中,添加HttpServletRequest对象作为参数,在方法体中,直接调用参数对象的getPara ...
- [WEB面试题] web前端面试题HTML+CSS第一弹,个人整理部分面试题汇总
以下内容仅供参考,网络整理而来 1.XHTML和HTML是什么有什么不同的区别 HTML是一种基本的WEB网页设计语言 XHTML可扩展超文本标记语言,是一种置标语言,表现方式与超文本标记语言(HTM ...
- immutable.js 在React、Redux中的实践以及常用API简介
immutable.js 在React.Redux中的实践以及常用API简介 学习下 这个immutable Data 是什么鬼,有什么优点,好处等等 mark : https://yq.aliyu ...
- mac上显示.开头的文件
第一种方法是在finder中按下command+shift+.键. 第二种方法是在命令行输入如下命令 defaults write com.apple.Finder AppleShowAllFiles ...
- linux 挂载命令mount、umount
mount /bin/mount语法:mount [-t文件系统] 设备文件名 挂载点mount -t iso9660 /dev/sr0 /mnt/cdromiso9660是固定的,光盘:所以 -t ...
- 使用DataTables插件与后台对接表格
function getResults(){ var callResults = $.ajax({ url: "....", //接口url type: "GET&quo ...
- SSH入门常用命令
一.参考链接大猫的博客
- phantomJs页面截图
因为phantomjs使用了一个真正的渲染引擎WebKit,它能截取一个web页面的真实影像,这是因为phantomjs能够折射出WEB页面上的任何东西,包括html,css,svg和Canvas等. ...
- springMVC入门-05
接着上一讲,介绍如何查询单个数据,此处介绍show()方法的实现.显示单条数据需要使用Users对象中的一个字段作为入参来进行对象查询,将查询出来的数据放在Model中,并且将model中的user对 ...
- flask的g对象
故名思议我们可以理解这个g对象是一个全局的对象,这个对象存储的是我们这一次请求的所有的信息,只是存储这一次的请求 g:global 1. g对象是专门用来保存用户的数据的. 2. g对象在一次请求中 ...