背景

  之前写过一篇《纯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设计列表加载更多的更多相关文章

  1. 微信小程序列表加载更多

    概述 基于小程序开发的列表加载更多例子. 详细 代码下载:http://www.demodashi.com/demo/13632.html 一.前言 基于小程序开发的列表加载更多例子. 二.运行效果 ...

  2. vue移动端上拉加载更多

    LoadMore.vue <template> <div class="load-more-wrapper" @touchstart="touchSta ...

  3. vue项目上滑滚动加载更多&下拉刷新

    上滑滚动时获取内容高度.屏幕高度和滚动高度(此处#sslist要为内容是id) 内容高度  let innerHeight = document.querySelector("#sslist ...

  4. 基于jQuery实现点击列表加载更多效果

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head>   < ...

  5. jQuery+php+Ajax文章列表点击加载更多功能

    jQuery+php+Ajax实现的一个简单实用的文章列表点击加载更多功能,点击加载更多按钮,文章列表加载更多数据,加载中有loading动画效果. js部分: <script type=&qu ...

  6. 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多

    通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...

  7. 【Vue.js】加载更多—vue-infinite-scroll

    引言 今天用到了一个加载更多的插件,用起来很方便,插件的名字叫做vue-infinite-scroll 我们可以去npmjs.com官网看一下这个vue-infinite-scroll的用法,官网上面 ...

  8. 【转载】Vue自定义指令实现pc端加载更多

    转载来源:https://www.86886.wang/detail/5a6f19e644f9da55274c3bbd,谢谢作者分享! 原理 document.documentElement.scro ...

  9. vue 原生添加滚动加载更多

    vue中添加滚动加载更多,因为是单页面所以需要在跳出页面时候销毁滚动,要不会出现错乱.我们在mounted建立滚动,destroyed销毁滚动. mounted () { window.addEven ...

随机推荐

  1. PyCharm 安装教程(Windows)

    python教程 http://www.runoob.com/python3/python3-basic-syntax.html PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性, ...

  2. 在JAVA中对于类,对象,继承,多态的看法

    这是我第一次学高级语言.很抱歉选择了JAVA,目标是开发一款可以上线的APP. 类:是建立对象的一个模板,就是系列产品中的基础款图纸.只是图纸而已.不是产品. 对象:是一个可以操作的对象.新建一个对象 ...

  3. 基于继承的 MethodInterceptor 动态代理(换种写法)

    net.sf.cglib.proxy.Enhancer Generates dynamic subclasses to enable method interception. This class s ...

  4. oracle之 any、some、all 解析

    举几个例子来说明ALL和ANY的用法 1. SELECT * FROM TABLEA WHERE FLD > ALL(SELECT FLD FROM TABLEA) 这相当于 SELECT * ...

  5. Codeforces831D Office Keys

    D. Office Keys time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  6. python网络爬虫开发实战(崔庆才)_14页_chromedriver环境配置和加载

    自己1,环境配置,我下载了相对应的Chromedriver(其实我也不知道对不对应,都是下载最新版的我猜应该会对应),然后在任何文件夹下输入command+shift+G,打开输入窗口,任何输入  / ...

  7. appium+python自动化脚本

    用pycharm,首先得把appium导入,操作如下(否则,运行程序后会报错,没有module appium) Settings->Project Interpreter,双击pip,搜索app ...

  8. 28.TreeSet

    与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在前一篇中详细讲解了TreeMap实现机制,如果客官详细看了这篇博文或者对TreeMap有比较详细的了解,那 ...

  9. Shader_ShaderForge_NGUI_序列帧/

    序列帧 Shader篇 Shader Forge序列帧算法! 附上Shader代码部分: // Shader created with Shader Forge v1.26 // Shader For ...

  10. java web spring 发送邮件

    package com.ws.common.mail; import java.io.File; import javax.mail.internet.MimeMessage; import java ...