el-table解决数据过少小于高度有留白的问题

问题:给el-table设置个高度,高度为500px,之后就添加如下4条数据,那么底部就没数据,直接就空白了,本文章就是为了解决这个问题,如果底部留白那么就添加几条空数据就行了.如果数据已达到高度了那么就不会留白了

1.效果

这个空列可以根据高度来决定添加几个空格子去铺满列表,解决列表留白问题

2.主要代码讲解

2.1为了不影响原始数据,建议在获取到接口列表数据后存入到俩个变量中,一个作为展示一个作为判断添加几行空数据,

javascript 复制代码
        addTable() {
            // 这边就是调用列表的接口之后数据展示
            this.tableData = [
                {
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀'
                },
                {
                    date: '2016-05-04',
                    name: '王小虎',
                    address: '上海市普'
                },
                {
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀'
                }
            ];
            this.tableDataFilter = [
                {
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀'
                },
                {
                    date: '2016-05-04',
                    name: '王小虎',
                    address: '上海市普'
                },
                {
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀'
                }
            ];
            this.$nextTick(() => {
                this.handleTableResize();
            });
        }

2.2监听页面高度发生变化后,需要判断展示几行空数据。

javascript 复制代码
    window.addEventListener('resize', this.handleTableResize); // 监听页面尺寸变化

2.3给每行设置固定的高度,必须要固定死,不然就判断失误了,如果内容过多可以设置show-overflow-tooltip

css 复制代码
.el-table /deep/ .el-table__row {
    height: 50px;
}

2.4 关键代码

设置个tableHeight:初始值为0

整个表格的高度,给el-table绑定一个ref,名字叫algorithmRef

javascript 复制代码
this.$refs.algorithmRef.$el.clientHeight

整个表格还剩下的留白的高度,这个-100是减去表头,-50是上面设置的一行的高度之后,50 * this.tableDataFilter.lengt,这个就是有数据的行高度,最后得出表格剩下留白高度

javascript 复制代码
  height = this.tableHeight - 100 - 50 * this.tableDataFilter.length;

result:要添加几行空白给表格数据

最后把空数据添加到tableData中

javascript 复制代码
    getTableHeight() {
            this.tableHeight = this.$refs.algorithmRef.$el.clientHeight;
            let height = 0;
            height = this.tableHeight - 100 - 50 * this.tableDataFilter.length;
            const result = Math.floor(height / 50);
            this.tableAdd(result);
            console.log(result, '要传给tableAdd的值'); 
        },
        tableAdd(num) {
            let addTable = [];
            for (let i = 0; i < num; i++) {
                addTable.push({ date: '', name: '', address: '' });
            }
            this.tableData = [...this.tableDataFilter, ...addTable];
        },

3.完整代码

javascript 复制代码
<!--
 * @Descripttion: el-table解决数据过少小于高度有留白的问题
 * @version:
 * @Author: 请叫我欧皇i
 * @email: 13071200550@163.com
 * @Date: 2023-11-13
-->

<template>
    <div class="container-table" ref="paramRef">
        <el-button @click="addTable()">添加</el-button>
        <div class="table-box">
            <el-table
                border
                :cell-style="{ borderColor: '#C0C0C0' }"
                :header-cell-style="{ borderColor: '#c0c0c0' }"
                :data="tableData"
                stripe
                height="100%"
                @resize="handleTableResize"
                style="width: 100%"
                ref="algorithmRef"
                class="tablebox"
            >
                <el-table-column show-overflow-tooltip label="自动数据" align="center">
                    <el-table-column prop="date" label="日期" width="180"> </el-table-column>
                    <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
                </el-table-column>
                <el-table-column label="人工数据" align="center">
                    <el-table-column prop="address" label="地址"> </el-table-column>
                    <el-table-column prop="date" label="日期" width="180"> </el-table-column>
                    <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
                </el-table-column>
            </el-table>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            tableData: [],
            tableDataFilter: [],
            tableHeight: 0 // 行高
        };
    },
    mounted() {
        // setTimeout(() => {
        // }, 1000);
        this.$nextTick(() => {
            this.getTableHeight(); // 监听el-table尺寸变化事件,重新获取表格高度
            window.addEventListener('resize', this.handleTableResize); // 监听页面尺寸变化
        });
    },
    methods: {
        handleTableResize() {
            this.$nextTick(() => {
                this.getTableHeight(); // 监听el-table尺寸变化事件,重新获取表格高度
            });
            // this.tableHeight = this.$refs.dynamicTable.$el.clientHeight;
            // console.log();
        },
        getTableHeight() {
            this.tableHeight = this.$refs.algorithmRef.$el.clientHeight;
            let height = 0;
            // 留白的高度
            height = this.tableHeight - 100 - 50 * this.tableDataFilter.length;
            const result = Math.floor(height / 50);
            this.tableAdd(result);
            console.log(result, '要传给tableAdd的值');
        },
        tableAdd(num) {
            let addTable = [];
            for (let i = 0; i < num; i++) {
                addTable.push({ date: '', name: '', address: '' });
            }
            this.tableData = [...this.tableDataFilter, ...addTable];
        },
        handlePageResize() {
            this.$nextTick(() => {
                this.getTableHeight(); // 页面尺寸变化后重新获取表格高度
            });
        },
        addTable() {
            // 这边就是调用列表的接口之后数据展示
            this.tableData = [
                {
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀'
                },
                {
                    date: '2016-05-04',
                    name: '王小虎',
                    address: '上海市普'
                },
                {
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀'
                },
                {
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀'
                },
                {
                    date: '2016-05-04',
                    name: '王小虎',
                    address: '上海市普'
                }
            ];
            this.tableDataFilter = [
                {
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀'
                },
                {
                    date: '2016-05-04',
                    name: '王小虎',
                    address: '上海市普'
                },
                {
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀'
                },
                {
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀'
                },
                {
                    date: '2016-05-04',
                    name: '王小虎',
                    address: '上海市普'
                }
            ];
            this.$nextTick(() => {
                this.handleTableResize();
            });
        }
    }
};
</script>

<style lang="scss" scoped>
.container-table {
    height: 70vh;
    width: 890px;
    background-color: #fff;
    .table-box {
        height: 70%;
        width: 100%;
    }
}
::v-deep .el-table .el-table__body--striped .el-table__row:nth-child(even) {
    background-color: #f7f7f7; /* 设置偶数行的背景色 */
}
.tablebox {
    border: 1px solid #c0c0c0;
}
/deep/ .el-table::after {
    width: 0;
}
/deep/ .el-table::before {
    height: 0;
}

// 这是关键,设置表格的每一行的高度,必须要固定死,如果内容过多可以设置show-overflow-tooltip
.el-table /deep/ .el-table__row {
    height: 50px;
}
/deep/ .el-table tbody tr td:nth-child(5),
/deep/ .el-table thead tr th:nth-child(5) {
    border-right: none;
}
/deep/ table thead tr:first-of-type th:nth-child(2) {
    border-right: none;
}
</style>
相关推荐
WeiXiao_Hyy12 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
吃杠碰小鸡12 小时前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone12 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_090112 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农13 小时前
Vue 2.3
前端·javascript·vue.js
夜郎king13 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
辰风沐阳13 小时前
JavaScript 的宏任务和微任务
javascript
夏幻灵14 小时前
HTML5里最常用的十大标签
前端·html·html5
冰暮流星14 小时前
javascript之二重循环练习
开发语言·javascript·数据库
Mr Xu_14 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js