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 相关文章推荐
深入了解Vue3模板编译原理
Nov 19 Vue.js
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 Vue.js
vue单元格多列合并的实现
Nov 26 Vue.js
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
vue 通过base64实现图片下载功能
Dec 19 Vue.js
vue组件是如何解析及渲染的?
Jan 13 Vue.js
vue使用过滤器格式化日期
Jan 20 Vue.js
Vue常用API、高级API的相关总结
Feb 02 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 Vue.js
vue-cli3.x配置全局的scss的时候报错问题及解决
Apr 30 Vue.js
vue中data里面的数据相互使用方式
Jun 05 Vue.js
vue如何在data中引入图片的正确路径
Jun 05 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
基于mysql的论坛(7)
2006/10/09 PHP
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
用jquery存取照片的具体实现方法
2013/06/30 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
Python functools模块学习总结
2015/05/09 Python
简单学习Python time模块
2016/04/29 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
一级方程式赛车官方网上商店:F1 Store(支持中文)
2018/01/12 全球购物
材料化学应届生求职信
2013/10/09 职场文书
电子银行营销方案
2014/02/22 职场文书
建议书怎么写
2014/03/12 职场文书
教师个人读书活动总结
2014/07/08 职场文书
迎国庆横幅标语
2014/10/08 职场文书
2014年新教师工作总结
2014/11/08 职场文书
逃课检讨书范文
2015/05/06 职场文书
学生早退检讨书(范文)
2019/08/19 职场文书
一篇文章带你复习java知识点
2021/06/28 Java/Android