Vue实现下拉加载更多


Posted in Vue.js onMay 09, 2021

熟悉Element-UI的开发者可能都会有这样的经历,它的无限滚动 InfiniteScroll 并不好用,下面介绍两种下拉加载的实现方法:

1. 使用el-table-infinite-scroll 插件

(1). 安装插件

npm install --save el-table-infinite-scroll

(2). 全局引入并注册

// main.js
 
import elTableInfiniteScroll from 'el-table-infinite-scroll';
 
Vue.use(elTableInfiniteScroll);

(3). 局部文件引入

<script>
// 引入
import elTableInfiniteScroll from 'el-table-infinite-scroll';
export default {
  // 注册指令
  directives: {
    'el-table-infinite-scroll': elTableInfiniteScroll
  }
}
</script>

(4). 使用指令

<el-table :height="tableHeight" v-el-table-infinite-scroll="loadMore">
 
</el-table>

(5). 代码实例

<template>
    <div class="app-container">
        <el-table :height="tableHeight" v-el-table-infinite-scroll="loadMore" :data="tableList">
            <!-- 表格数据省略 -->
        </el-table>
    </div>
</template>
 
<script>
// 引入插件
import elTableInfiniteScroll from "el-table-infinite-scroll";
 
export default {
    name: "index",
    data() {
        return {
            // 表格高度
            tableHeight:"",
            // 数据总数
            tableCount:0,
            // 表格数据列表
            tableList:[],
            // 是否加载中
            tableLoading:false,
            // 表格搜索条件
            tableSearch:{
                page:1
            }
        }
    },
    // 注册指令
    directives: {
        "el-table-infinite-scroll": elTableInfiniteScroll,
    },
 
    created() {
        let windowHeight =document.documentElement.clientHeight || document.body.clientHeight;
        // 动态计算表格的高度,200为屏幕内除了表格以外其他元素的高度,依实际情况而定
        this.tableHeight = windowHeight - 200 + "px";
    },
    mounted(){
        this.getTableData(this.tableSearch);
    },
 
    methods: {
        // 请求表格数据
        getTableData(search) {
            let page = search.page;
            let url = "index?page=" + page;
            // 首次打开页面要加载一次数据,为了防止数据过多自动触发滚动,此处需要置为加载中
            this.tableLoading = true;
            this.$http.get(url).then((result) => {
                if (res.code == 10000) {
                    // 拼接数据
                    this.tableList = this.tableList.concat(result.data.list);
                    this.tableCount = result.count;
                    this.tableSearch.page = result.current;
                    this.tableLoading = false;
                }
            });
        },
        // 加载更多
        loadMore() {
            if (!this.tableLoading) {
                this.tableLoading = true;
                if (this.tableList.length < this.tableCount) {
                    this.tableSearch.page++;
                    this.getTableData(this.tableSearch);
                } else {
                    this.$message("已加载完所有的数据!");
                    this.tableLoading = false;
                }
            }
        },
    }
};
</script>

2. 自定义下拉加载方法

上面使用的插件需要依赖Element-UI,如果没有使用Element-UI,那就只能自己写一个下拉加载了,实现代码如下:

<template>
    <div class="app-container">
        <div :style="{height:tableHeight,overflow:'auto'}" id="tableBox">
            <!-- 表格数据省略 -->
        </div>
    </div>
</template>
 
<script>
export default {
    name: "index",
    data() {
        return {
            // 表格高度
            tableHeight:"",
            // 数据总数
            tableCount:0,
            // 表格数据列表
            tableList:[],
            // 是否加载中
            tableLoading:false,
            // 表格搜索条件
            tableSearch:{
                page:1
            }
        };
    },
    created(){
        let windowHeight = document.documentElement.clientHeight || document.body.clientHeight;
        // 动态计算表格的高度,200为屏幕内除了表格以外其他元素的高度,依实际情况而定
        this.tableHeight = windowHeight - 200 +'px';
    },
    mounted() {
        this.getTableData(this.tableSearch);
        document.getElementById("tableBox").addEventListener('scroll',this.onTableScroll); 
    },
 
    beforeDestroy() {
        // 移除监听事件
        window.removeEventListener('scroll', this.onTableScroll)
    },
 
    methods: {
        onTableScroll(){
            var obj = document.getElementById("tableBox");
            var scrollHeight = obj.scrollHeight;
            var scrollTop = obj.scrollTop; 
            var objHeight = obj.offsetHeight;  
            // 100为阈值,可根据实际情况调整    
            if(scrollHeight <= (scrollTop + objHeight + 100) && !this.tableLoading && this.tableList.length<this.tableCount){ 
                this.tableLoading = true;
                this.tableSearch.page++;
                setTimeout(()=>{   
                    this.getTableData(this.tableSearch);
                },300)
            }
        },
 
        getTableData(search){
            let page = search.page;
            let url = "index?page=" + page;
            // 首次打开页面要加载一次数据,为了防止数据过多自动触发滚动,此处需要置为加载中
            this.tableLoading = true;
            this.$http.get(url).then((result) => {
                if (res.code == 10000) {
                    // 拼接数据
                    this.tableList = this.tableList.concat(result.data.list);
                    this.tableCount = result.count;
                    this.tableSearch.page = result.current;
                    this.tableLoading = false;
                }
            });
        },
        
     
    },
};
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
Vue 的 v-model用法实例
Nov 23 Vue.js
如何实现vue的tree组件
Dec 03 Vue.js
vue 数据操作相关总结
Dec 17 Vue.js
详解Vue2的diff算法
Jan 06 Vue.js
Vuex实现简单购物车
Jan 10 Vue.js
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
如何在 Vue 表单中处理图片
Jan 26 Vue.js
Vue中使用wangeditor富文本编辑的问题
Feb 07 Vue.js
Vue详细的入门笔记
May 10 Vue.js
详解Vue的sync修饰符
May 15 Vue.js
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 Vue.js
如何使用vue3打造一个物料库
vue完美实现el-table列宽自适应
关于Vue Router的10条高级技巧总结
May 06 #Vue.js
Vue项目中如何封装axios(统一管理http请求)
May 02 #Vue.js
使用vue-element-admin框架从后端动态获取菜单功能的实现
vue使用v-model进行跨组件绑定的基本实现方法
关于vue中如何监听数组变化
You might like
生成静态页面的PHP类
2006/07/15 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
php文件上传的两种实现方法
2016/04/04 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
js判断是否是手机页面
2017/03/17 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
简单理解Vue中的nextTick方法
2018/01/30 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
在windows下快速搭建web.py开发框架方法
2016/04/22 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
Django实现文件上传下载功能
2019/10/06 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
高中毕业生个人自我鉴定
2013/11/24 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
户外拓展活动方案
2014/02/11 职场文书
2014年重阳节老干部座谈会上的讲话稿
2014/09/25 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
影视后期实训报告
2014/11/05 职场文书
党员剖析材料范文
2014/12/18 职场文书