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下拉框加上滚动加载
在项目中,我们需要运用到很多来自后端返回的数据.有时是上百条,有时甚至上千条.如果加上后端的多表查询或者数据量过大,这就导致在前端的显示就会及其慢,特别是在网络不好的时候更是如此. 自然,后端就做了一 ...
随机推荐
- webpack开发工具
source map 用来调试打包后的代码 const path = require('path'); const HtmlWebpackPlugin = require('html-webpack- ...
- visibilitychange:API详解
利用页面可见性API搞个怪 继各大站点.博客在用console发招聘.玩游戏.埋彩蛋之后(知乎相关链接),小剧似乎又发现了一个好玩儿的东西,目测会火,利用页面可见性API做些小技俩. 页面可见性是什么 ...
- loj#6235. 区间素数个数(min25筛)
题意 题目链接 Sol min25筛的板子题,直接筛出\(g(N, \infty)\)即可 筛的时候有很多trick,比如只存\(\frac{N}{x}\)的值,第二维可以滚动数组滚动掉 #inclu ...
- AIX修改时区,配置NTP服务
AIX修改时区 smitty --> System Environments -->Change/Show Data and Time -->Change Time Zone Usi ...
- CentOS7.4 + Hadoop2.9安装配置管理(分布式)
1. 规划 1.1. 机器列表 NameNode SecondaryNameNode DataNodes 192.168.1.121 192.168.1.122 192.168.1.101 192 ...
- 解决提交项目到GitHub,报错Please tell me who you are的问题
描述: 在第一次提交项目到GitHub时,出现了以下问题 看了一下错误原因:Run git config --global user.email "you@example.com" ...
- leetCode题解 Reverse Words in a String III
1.题目描述 Given a string, you need to reverse the order of characters in each word within a sentence wh ...
- 使用 Azure CLI 管理 Azure 磁盘
Azure 虚拟机使用磁盘来存储 VM 操作系统.应用程序和数据. 创建 VM 时,请务必选择适用于所需工作负荷的磁盘大小和配置. 本教程介绍如何部署和管理 VM 磁盘. 学习内容: OS 磁盘和临时 ...
- 【gp数据库】OLTP和OLAP区别详解
原来一直使用Oracle,新公司使用greenplum后发现系统的并发性差很多,后来才了解因为Oracle属于OLTP类型,而gp数据库属于OLAP类型的.具体了解如下: 数据库系统一般分为两种类型, ...
- NSArray排序方法讲解
NSArray排序方法讲解 给数组排序有着多种方式 最麻烦的是sortedArrayUsingSelector:,其次是sortedArrayUsingDescriptors:,最容易使用的就是sor ...