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-cli项目在IE浏览器打开报错解决方法
Dec 10 Vue.js
详解vue中使用transition和animation的实例代码
Dec 12 Vue.js
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
Vue实现省市区三级联动
Dec 27 Vue.js
vue3+typeScript穿梭框的实现示例
Dec 29 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
vue如何使用rem适配
Feb 06 Vue.js
Vue+Bootstrap实现简易学生管理系统
Feb 09 Vue.js
vue中h5端打开app(判断是安卓还是苹果)
Feb 26 Vue.js
vue中axios封装使用的完整教程
Mar 03 Vue.js
vue中三级导航的菜单权限控制
Mar 31 Vue.js
vue项目多环境配置(.env)的实现
Jul 21 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提示Notice: Undefined variable的解决办法
2012/11/24 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
php中异常处理方法小结
2015/01/09 PHP
多广告投放代码 推荐
2006/11/13 Javascript
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
Python中的包和模块实例
2014/11/22 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
iPython pylab模式启动方式
2020/04/24 Python
Python random模块的使用示例
2020/10/10 Python
火锅店创业计划书范文
2014/02/02 职场文书
商场消防演习方案
2014/02/12 职场文书
学校安全管理责任书
2014/07/23 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
高校自主招生自荐信2015
2015/03/04 职场文书
禁毒主题班会教案
2015/08/14 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书