当前有一个需求,页面不分页,又想在一页显示全部数据,这个时候其实就可以用数据懒加载。

随鼠标滚动到滚动条末尾,自动加载下一页的数据。created的时候默认加载20条数据。

这里差不多到末端了

鼠标滑到末端后,触发加载第二页数据

 

代码实现:

先定义个table  (getPageBodyHeight 方法是我通过页面自适应监听页面宽高变化,之前帖子有栗子,计算table的高度,简单点的可以自己设置固定高度)

<el-table border
                  v-loading="loading"
                  :data="tableData"
                  :row-key="getRowKeys"
                  :height="getPageBodyHeight">
          <el-table-column type="selection" :reserve-selection="true" width="50"></el-table-column>
          <el-table-column prop="cla" :label="$t('列1')" show-overflow-tooltip></el-table-column>
          <el-table-column prop="clb" :label="$t('列2')" show-overflow-tooltip></el-table-column>
          <el-table-column prop="clc" :label="$t('列3')" show-overflow-tooltip></el-table-column>
          <el-table-column prop="cld" :label="$t('列4')" show-overflow-tooltip></el-table-column>
          <el-table-column prop="cle" :label="$t('列5')" show-overflow-tooltip></el-table-column>
          <el-table-column prop="clf" :label="$t('列6')" show-overflow-tooltip></el-table-column>

        </el-table>

栗子中主要用到的几个变量

        data() {
            return {
                loading: false,
                tableData: [],
                pagination: {
                    page: 1,
                    pageSize: 20,
                    total: 0,
                },
                totalPage: 5,
                countTotal: 20,
                selectedIds:[],
                checked:false,
                otherHeight:0,
                pageHeight:0,
            }
        },

creatde中模拟默认查询20条数据

        created() {
            //this.defaultDataTime();
            //this.search();

            this.tableData = []
            for (let i = 1; i <=this.countTotal ; i++) {
                this.tableData.push({"cla": "cla-"+i,"clb": "clb-"+i,"clc": "clc-"+i})
            }
        },

重点:在mounted中设置监听鼠标滚动事件

mounted() {
            //this.watchSize();
            this.lazyLoading();
        },

            lazyLoading(){
                let dom = document.querySelector(".el-table__body-wrapper");
                dom.addEventListener("scroll", (v) => {
                    const scrollDistance = dom.scrollHeight - dom.scrollTop - dom.clientHeight;
                    console.log("鼠标滑动-scrollDistance",scrollDistance)
                    // if (scrollDistance <= 0) {  //分辨率问题,如果设置 100% ,滑倒最底部,scrollDistance的值 可能为 0.201 到 -0.201
                    if (scrollDistance <= 1) {
                        //等于0证明已经到底,可以请求接口
                        if (this.pagination.page >= this.totalPage) {
                            //判断是否到达底部
                            // this.$message.warning("我~是有底线的 (~ ̄▽ ̄)~");
                            console.log("我~是有底线的 (~ ̄▽ ̄)~")
                        }
                        if (this.pagination.page < this.totalPage) {
                            //当前页数小于总页数就请求
                            this.pagination.page ++; //当前页数自增
                            console.log("页面已经到达底部,可以请求接口,请求第 "+ this.pagination.page + " 页数据");

                            var cIndex = this.countTotal + 10 ;
                            for (let i = (this.countTotal + 1) ; i <= cIndex ; i++) {
                                this.tableData.push({"cla": "cla-"+i,"clb": "clb-"+i,"clc": "clc-"+i})
                            }
                            this.countTotal += 10 ;
                            //this.getData();
                            // this.append();
                        }
                    }
                });
            },

Logo

前往低代码交流专区

更多推荐