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+openlayers绘制省市边界线
Dec 24 Vue.js
vue实现防抖的实例代码
Jan 11 Vue.js
如何让vue长列表快速加载
Mar 29 Vue.js
使用这 6个Vue加载动画库来减少我们网站的跳出率
May 18 Vue.js
Vue图片裁剪组件实例代码
Jul 02 Vue.js
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
Vue的生命周期一起来看看
Feb 24 Vue.js
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 Vue.js
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
vue修饰符.capture和.self的区别
Apr 22 Vue.js
Vue OpenLayer 为地图绘制风场效果
Apr 24 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一些公用函数的集合
2008/03/27 PHP
php学习之运算符相关概念
2011/06/09 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
JS request函数 用来获取url参数
2010/05/17 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
jQuery表单验证功能实例
2015/08/28 Javascript
jquery输入数字随机抽奖特效的简单实现代码
2016/06/10 Javascript
js轮播图代码分享
2016/07/14 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
vue的基本用法与常见指令
2017/08/15 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
vue+iview实现分页及查询功能
2020/11/17 Vue.js
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
Python中转换角度为弧度的radians()方法
2015/05/18 Python
python 爬取微信文章
2016/01/30 Python
python实现二叉树的遍历
2017/12/11 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
python实现PID算法及测试的例子
2019/08/08 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
法警的竞聘演讲稿
2014/01/02 职场文书
办公室文员自荐书
2014/02/03 职场文书
期末评语大全
2014/05/04 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫