【前端】Vue3+Elment Plus实现table表格右侧滑动分页

本文介绍了如何在Vue3项目中结合ElementPlus实现表格固定列并添加右侧滚动条,以及在滚动到底部时自动加载下一页数据的功能。在实现过程中,通过监听滚动事件并判断滚动条位置来触发加载,同时自定义了loading加载样式。文章还分享了遇到的挑战和解决方案,并鼓励读者交流学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体要实现的需求

前段时间实现实现一个表格功能由于一行数据表较多,所以用到el-table表格固定表头,固定头两列和最后一列,底部有左右滑动的滚动条。一页展示二十条数据,需要实现滚动分页功能,table滚动条到底部的时候可自动加载第二页数据,在底部加载第二页数据的时候要有loading加载样式,底部没有用到分页Pagination 标签分页样式。在实现的过程也遇到很多的坑,还好最后把功能实现了,在这里做下总结。大家有好的方法和建议可以在评论区交流。

Element plus 查询table表格组件demo

打开elment plus组件找到table表格可以看到里面有固定列demo代码,但是demo使用跟我们业务需求有一定的差距,需要加入自己的业务需求代码处理才能是吸纳相应的功能,一开始参考了elment plus里面Scrollbar 滚动条标签来做,并没有成功实现。后来换了一种方式来做,代码就在下面。
在这里插入图片描述

elment 监测table右侧滚动条到底部代码

elment和elment plus中加入addEventListener监听还是有区别的,请看代码你就明白了

this.$refs.multipleTable.bodyWrapper.addEventListener('scroll', (res) => {
          let height = res.target
          let clientHeight = height.clientHeight
          let scrollTop = height.scrollTop
          let scrollHeight = height.scrollHeight
          if (clientHeight + scrollTop + 50> scrollHeight) {
            this.currentPage += 1;
            this.getDataList()
          }
        })

elment plus监测table右侧滚动条到底部代码

  this.$nextTick(() => {
      document.querySelector(".el-scrollbar__wrap.el-scrollbar__wrap--hidden-default").addEventListener('scroll', (res: any) => {
        let scrollTop = res.target.scrollTop;
        let winHeight = res.target.clientHeight;
        let scrollHeight = res.target.scrollHeight;
        if (scrollTop + winHeight + 50 > scrollHeight && !this.busyScroll) {
          this.currentPage += 1;
          this.getDataList()
        }
      })
    })

替换loading加载样式

替换loading样式代码,vue样式代码用到了v-sort槽标签处理。

       <template v-slot:append style="text-align: center">
          <div class="table-loading" style="height: 50px;">
          </div>
        </template>
      </el-table>

调用 this.getDataList()方法loading为true,接口返回是loading为this.loading = false;,关闭loading加载。

 getDataList() {
 this.loading = true;
    const listLoading= ElLoading.service({
      target: document.querySelector(".table-loading") as HTMLElement,
      lock: true
    })
     const pageParam = {
      pageIndex: this.currentPage,
      limit: this.pageSize,
      param: this.param
    };
    http.post('localhost/page/list', pageParam).then(res => {
      this.list = [...this.lmodelList, ...res.data.data];
      this.totalPages = res.data.totalPages;
      this.loading = false;
      listLoading.close()
    })
    }

总结

在前端的路上要不断的学习,实践,总结。这一次做一次整理总结一下。方便后期遇到相似的问题的可以有参考思路。也便于其他编程伙伴查阅学习。欢迎互相关注交流。

### 封装适用于移动端的 Vue 表格组件 为了创建一个适合移动设备使用的表格组件,可以考虑以下几个方面: #### 移动端优化的关键特性 - **响应式布局**:确保表格能够适应不同屏幕尺寸。 - **虚拟滚动**:对于大数据量的情况,采用虚拟列表技术提高性能[^3]。 - **手势操作支持**:提供滑动手势切换页面等功能。 #### 组件设计思路 ##### 基础结构搭建 首先引入必要的依赖库 `Element Plus` 和其他可能需要用到的支持包。接着定义基础模板和样式文件,这里假设已经安装好了所需环境并配置好项目构建工具链。 ```javascript // main.js 或 setup 文件中全局注册 element plus import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; import ElementPlus from &#39;element-plus&#39;; import &#39;element-plus/lib/theme-chalk/index.css&#39;; const app = createApp(App); app.use(ElementPlus); app.mount(&#39;#app&#39;); ``` ##### 定义核心逻辑 接下来编写具体的表格组件代码如下所示: ```typescript // MobileTable.vue <template> <el-table v-bind="$attrs" ref="tableRef" :data="filteredData" @row-click="handleRowClick" class="mobile-table"> <!-- 自定义表头 --> <el-table-column type="index" width="50"></el-table-column> <el-table-column v-for="(column, index) in columns" :key="index" :prop="column.prop" :label="column.label" :align="column.align || &#39;left&#39;" show-overflow-tooltip /> <!-- 如果开启了分页,则渲染底部区域 --> <template #append v-if="showPagination && total > pageSize"> <div class="pagination-container"> <el-pagination background layout="prev, pager, next" :total="total" :page-size="pageSize" @current-change="onPageChange"/> </div> </template> </el-table> </template> <script lang="ts"> export default { props: { data: Array, columns: Array, loading: Boolean, tableConfig: Object, showPagination: Boolean, paginationConfig: Object }, computed: { filteredData() { // 可在此处加入筛选条件处理 return this.data; } }, methods: { handleRowClick(row) {}, onPageChange(pageNumber) {} } }; </script> <style scoped> .mobile-table .cell { white-space: nowrap !important; } .pagination-container { margin-top: 1rem; text-align: center; } @media (max-width:768px){ /* 对于更小分辨率下的额外调整 */ ... } </style> ``` 此段代码实现了基本功能的同时也保留了一定程度上的灵活性以便后续扩展更多高级特性和定制化需求[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小冷coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值