使用vue之directive设计列表加载更多
背景
之前写过一篇《纯JS实现加载更多(VUE框架)》,它的逻辑思路比较清晰易懂,而今天看了一天公司项目的部分功能代码,发现同事们写的加载更多的功能更加的有趣,而且易于封装到一个组件当中,便于日后的重用。
思路
同样是检测滚动,然后计算可滑动高度、滑动高度、屏幕高度然后计算什么时候可以向后台请求数据,加载数据。而不同的是这次结合了vue.js中的全局API之Vue.directive(自定义指令,关于它的知识,官网上面已经写得很清晰了),创建一个自定义指令,类似于v-show这样的指令,然后直接挂到DOM那里,再写上参数,通过directive对应的钩子函数(注意,这里的全局api也有自己相对应的钩子函数哟),来为绑定了该自定义指令的DOM节点添加滑动事件。
动手吧
首先使用全局api Vue.directive自定义自己的指令,取名为‘loadMore’,然后写下钩子函数inserted()、unbind()。
其中onScroll()函数是自定义方法,作用是实现滚动加载更多的功能。
inseted()钩子函数的作用是当被绑定元素插入父节点时,调用此钩子函数,为被绑定元素绑定监听滑动scroll的时间方法,一旦被绑定元素被监听到滑动,调用onScroll()函数实现加载更多。
unbind()钩子函数的作用是当指令与元素解绑时,调用该钩子(即退出页面或者程序时调用)
程序如下所示:
import Vue from 'vue';
Vue.directive('loadMore', {
inserted(ele, data) {
ele.addEventListener('scroll', data.def.onScroll.bind(null, data))
console.log(data)
console.log('inserted钩子函数被触发咯~~~')
},
unbind(ele, data) {
ele.removeEventListener('scroll', data).def.onScroll.bind(null, data)
console.log('解绑时调用!!!!')
},
onScroll(data, event) {
let target = event.target;
let loadMoreConfig = data.value;
let screenHeight = target.offsetHeight;
let scrollTop = target.scrollTop;
let totalHeight = target.scrollHeight;
if (!loadMoreConfig.loading && totalHeight > screenHeight && totalHeight - scrollTop - screenHeight < loadMoreConfig.scrollBottomOffset) {
loadMoreConfig.onScrollBottom();
loadMoreConfig.loading = true;
}
},
});
上面这段程序写在<script></script>里面,写在export default外面。
使用自定义指令
因为上面定义了一个指令,叫loadMore, 像v-show、v-if一样挂载DOM中,然后传需要的参数就可以了,如下
<pull-refresh :next="reloadNewKnowLedgeDataList" class="knowledge-list-container" v-load-more="newPageInfo.loadMoreConfig">……
上面传的参数是newPageInfo.loadMoreConfig,在data()里面,它是这样的
data() {
return {
newPageInfo: {
isLoadedData: false,
pageNo: 1, // 第一页
pageSize: 15, // 每一次加载的最大页数
dataList: [],
loadMoreConfig: {
onScrollBottom: this.onScrollBottomForNewPage, //调用加载的方法
scrollBottomOffset: 20, //距离底部门槛阈值
loading: false //是否加载
}
}
}
看到了吗,因为之前在全局api directive里面自己定义的监听滑动后触发函数onScroll(),一旦触发它,函数就会调用this.onScrollBottomForNewPage()方法来加载数据
接着上面按逻辑执行
onScrollBottomForNewPage() {
this.newPageInfo.pageNo += 1;
this.queryNewKnowLedgeDataList();
},
queryNewKnowLedgeDataList(callback) {
this.loading(true);
this.queryKnowLedgeDataMethod('new').then((res) => {
if (callback && typeof callback === 'function') {
callback();
}
this.newPageInfo.isLoadedData = true;
this.loading(false);
this.processNewKnowLedgeData(res);
}, (error) => {
if (callback && typeof callback === 'function') {
callback();
}
this.loading(false);
this.newPageInfo.loadMoreConfig.loading = true;
this.newPageInfo.isLoadedData = true;
if (error !== null) {
this.$vux.toast.show({ text: '数据加载失败', type: 'text' });
}
});
},
queryKnowLedgeDataMethod(type) {
let params;
if (type === 'new') {
params = {
'pageNo': this.newPageInfo.pageNo,
'pageSize': this.newPageInfo.pageSize,
'findType': 0
};
} else {
params = {
'pageNo': this.hotPageInfo.pageNo,
'pageSize': this.hotPageInfo.pageSize,
'findType': 1
};
}
return this.$http.get('rule/findRuleNewOrHotList', { 'params': params });
},
processNewKnowLedgeData(res) {
if (!res) {
return;
}
if (res.data && res.data.length > 0) {
if (this.newPageInfo.pageNo === 1) {
this.newPageInfo.dataList = res.data;
} else {
this.newPageInfo.dataList = this.newPageInfo.dataList.concat(res.data);
}
this.newPageInfo.loadMoreConfig.loading = false;
} else {
this.newPageInfo.loadMoreConfig.loading = true;
if (this.newPageInfo.pageNo === 1) {
this.newPageInfo.dataList = [];
} else {
this.$vux.toast.show({ text: '没有更多', type: 'text' });
}
}
},
使用vue之directive设计列表加载更多的更多相关文章
- 微信小程序列表加载更多
概述 基于小程序开发的列表加载更多例子. 详细 代码下载:http://www.demodashi.com/demo/13632.html 一.前言 基于小程序开发的列表加载更多例子. 二.运行效果 ...
- vue移动端上拉加载更多
LoadMore.vue <template> <div class="load-more-wrapper" @touchstart="touchSta ...
- vue项目上滑滚动加载更多&下拉刷新
上滑滚动时获取内容高度.屏幕高度和滚动高度(此处#sslist要为内容是id) 内容高度 let innerHeight = document.querySelector("#sslist ...
- 基于jQuery实现点击列表加载更多效果
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> < ...
- jQuery+php+Ajax文章列表点击加载更多功能
jQuery+php+Ajax实现的一个简单实用的文章列表点击加载更多功能,点击加载更多按钮,文章列表加载更多数据,加载中有loading动画效果. js部分: <script type=&qu ...
- 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多
通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...
- 【Vue.js】加载更多—vue-infinite-scroll
引言 今天用到了一个加载更多的插件,用起来很方便,插件的名字叫做vue-infinite-scroll 我们可以去npmjs.com官网看一下这个vue-infinite-scroll的用法,官网上面 ...
- 【转载】Vue自定义指令实现pc端加载更多
转载来源:https://www.86886.wang/detail/5a6f19e644f9da55274c3bbd,谢谢作者分享! 原理 document.documentElement.scro ...
- vue 原生添加滚动加载更多
vue中添加滚动加载更多,因为是单页面所以需要在跳出页面时候销毁滚动,要不会出现错乱.我们在mounted建立滚动,destroyed销毁滚动. mounted () { window.addEven ...
随机推荐
- 收集几个html和element-ui的录入控件
我希望有一个控件去显示或输入账本的金额 先做一些资料收集,也希望大家给个建议 输入银行账号会设置每四位添加一个空格 https://blog.csdn.net/wkx18330698534/artic ...
- Geomystery现已上架!
欢迎体验由王涵.程立智.郑昊.蔡镇泽.李明伦.温志成同学开发的几何解谜游戏Geomystery,现已上架Microsoft官方商城! https://www.microsoft.com/zh-cn/s ...
- JMS Cluster modules
是GeoServer实现集群还是在数据库实现集群? Hadoop.Spark.HBase与Redis的适用性见解:https://blog.csdn.net/cuiyaonan2000/article ...
- [转]MYSQL性能查看(命中率,慢查询)
网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一 ...
- 6-使用requests库封装类处理get/post请求
1.request安装 1)pip安装,直接pip install requests 2)下载离线包安装,加压后,命令行进入路径,执行python setup.py install 2.创建工程 注意 ...
- 《Java性能调优》学习笔记(1)
性能的参考指标 执行时间 -- 从代码开始运行到结束的时间 CPU时间 -- 函数或者线程占用CPU的时间 内存分配 -- 程序在运行时占用内存的情况 磁盘吞吐量 -- 描述IO的使用情况 网络吞吐量 ...
- 使用 shell 在多服务器上批量操作
需求 日常工作中,我们常需要同时在多台服务器上执行同样的命令,如对比日志.检查服务等.这就需要我们有服务器批量操作的能力. 两年前写过一篇文章,shell实现SSH自动登陆 使用 shell 的 ex ...
- HNOI2019退役记
退役 警告. 今年虽然我没有变强, 但是还是比去年强一点(去年树形dp都不会). Day0 明天就是省选了,晚上22:13还没有睡觉,真的是状态不好. 打了一下LCT的板子,发现终于理解了...(这叫 ...
- 宝塔面板下安装zabbix
宝塔面板之前已经安装完成,如果不会可以查看上一个日志.接下来开始安装zabbix 1.添加系统用户和组 2. yum -y install epel-release #安装源 3.使用命令 yum - ...
- Kali学习笔记23:Web渗透简介
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 我这里先说几句: 其实从缓冲区溢出到Web渗透之间还有 ...