vue2+element的table滚动显示

本文介绍如何在Vue项目中实现表格内容滚动而标题不滚动的效果。通过引入vue-seamless-scroll组件,并配置相应的计算属性,实现表格的无缝滚动功能,同时保持表头固定显示。

【1】需要安装滚动插件

【2】给标题单独设置一个table,将要滚动的区域放在<vue-seamless-scroll>里面,这样可以防止标题跟着一起滚动

 <table class="kpitable">
          <thead class="thead">
            <th>项目</th>
            <th>项目</th>
            <th>电话</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>电话</th>
            <th>电话</th>
          </thead>
        </table>

        <vue-seamless-scroll
          :data="tabledata2"
          :class-option="optionHover"
          class="seamless-warp"
        >
          <el-table
            id="kpitable"
            :data="tabledata2"
            border
            show-summary
            :sum-text="'汇总'"
            size="mini"
            style="width: 100%; height: 100%"
            :header-cell-style="{ background: '#ff7f50', color: '#fff' }"
            class="
              custom-table-2
              hidden-thead
              el-table__body-wrapper::-webkit-scrollbar
            "
            ref="kpitable"
          >
            <el-table-column prop="project" label=""> </el-table-column>
            <el-table-column prop="total" label=""> </el-table-column>
            <el-table-column prop="first" label=""> </el-table-column>
            <el-table-column prop="second" label=""> </el-table-column>
            <el-table-column prop="firstday" label=""> </el-table-column>
            <el-table-column prop="secondday" label=""> </el-table-column>
            <el-table-column prop="thirdday" label=""> </el-table-column>
          </el-table>
        </vue-seamless-scroll>
   

【3】在computed里面设置滚动的属性

computed: {
    optionHover() {
      return {
        step: 0.5, // 数值越大速度滚动越快
        limitMoveNum: 1, // 开始无缝滚动的数据量 this.dataList.length
        hoverStop: true, // 是否开启鼠标悬停stop
        direction: 1, // 0向下 1向上 2向左 3向右
        openWatch: true, // 开启数据实时监控刷新dom
        singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
        singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
        waitTime: 1000, // 单步运动停止的时间(默认值1000ms)
      };
    },
  },

在使用 Vue 2 + Element UI 的 `el-table` 组件时,监听滚动条滚动到底部是一个常见的需求(例如实现表格数据的无限滚动或分页加载)。由于 `el-table` 的结构较为复杂,其滚动容器并不是 `<el-table>` 根元素本身,而是内部的一个 `.el-table__body-wrapper` 元素,因此需要正确获取该 DOM 元素并监听其 `scroll` 事件。 --- ### ✅ 解决方法:监听 `el-table` 滚动到底部 #### 步骤如下: 1. 使用 `ref` 获取 `el-table` 实例。 2. 在 `mounted` 钩子中获取 `.el-table__body-wrapper` 的 DOM 元素。 3. 监听其 `scroll` 事件,判断是否滚动到底部。 4. 判断条件:`scrollTop + clientHeight >= scrollHeight - tolerance` --- ### 🧩 示例代码(Vue 2 + Template + Element UI): ```vue <template> <el-table ref="tableRef" :data="tableData" style="width: 100%; height: 400px;" :height="400" > <el-table-column prop="name" label="姓名" width="180"></el-table-column> <el-table-column prop="age" label="年龄" width="180"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [], loadingMore: false, pageSize: 20, }; }, mounted() { this.loadInitialData(); this.$nextTick(() => { this.listenToScroll(); }); }, methods: { loadInitialData() { // 模拟初始数据 for (let i = 1; i <= 20; i++) { this.tableData.push({ name: `用户${i}`, age: 20 + (i % 10), address: `地址 ${i}` }); } }, listenToScroll() { const bodyWrapper = this.$refs.tableRef.bodyWrapper; // 获取滚动容器 bodyWrapper.addEventListener('scroll', this.handleScroll); }, handleScroll() { const bodyWrapper = this.$refs.tableRef.bodyWrapper; const { scrollTop, clientHeight, scrollHeight } = bodyWrapper; // 设置一个容差值(避免因像素误差导致无法触发) const tolerance = 5; if (scrollTop + clientHeight >= scrollHeight - tolerance && !this.loadingMore) { this.loadMoreData(); } }, loadMoreData() { this.loadingMore = true; // 模拟异步加载更多数据 setTimeout(() => { const start = this.tableData.length + 1; for (let i = start; i < start + 10; i++) { this.tableData.push({ name: `用户${i}`, age: 20 + (i % 10), address: `地址 ${i}` }); } this.loadingMore = false; }, 800); } }, beforeDestroy() { const bodyWrapper = this.$refs.tableRef.bodyWrapper; bodyWrapper.removeEventListener('scroll', this.handleScroll); } }; </script> ``` --- ### 🔍 问题产生的原因解释: - `el-table` 的滚动是通过内部的 `.el-table__body-wrapper` 容器控制的,而不是整个表格根元素。 - 直接给 `<el-table>` 绑定 `@scroll` 不会生效,因为 Element UI 没有将原生 `scroll` 事件暴露为组件事件。 - 必须通过 `this.$refs.tableRef.bodyWrapper` 访问真实滚动容器,并手动添加事件监听。 - 滚动到底部的判断依赖于三个关键属性: - `scrollTop`: 当前滚动距离顶部的距离 - `clientHeight`: 可视区域高度 - `scrollHeight`: 内容总高度 - 当 `scrollTop + clientHeight >= scrollHeight` 时即为底部。 --- ### ⚠️ 注意事项: 1. **内存泄漏防护**:务必在 `beforeDestroy` 中移除事件监听器。 2. **防抖处理**:如果加载频繁,建议对 `loadMoreData` 做节流或状态锁(如 `loadingMore` 标志位)。 3. **虚拟滚动替代方案**:若数据量极大,建议使用 `el-table` 的 `lazy` + `load` 或结合 `virtual-scroll` 第三方库优化性能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

rainbowyx

你的鼓励是我持续写下去的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值