element-ui中的el-table滚动加载事件

问题描述:当表格数据量过多,一次请求回来会很卡,同时又不想分页的情况下,我们想让鼠标滚动到表格底部时再去请求数据。

解决思路:项目用的是element-ui的框架,给el-table添加一个滚动事件,计算滚动条到顶部的距离,容器的高度,以及滚动内容的高度,当 滚动条到顶部的距离+容器的高度=滚动内容的高度时请求数据。注:如果容器有padding和margin的话需要相应增减。

我试过直接在el-table 上加@scoll事件是不生效的,在网上查阅资料后解决方案如下:

1.给table一个ref属性。

2.监听scroll事件。

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 + 300 > scrollHeight){
        console.log(clientHeight + scrollTop);
        console.log(scrollHeight);
    }

},true);
复制代码

因为组件中的table是由几个table组合起来的,所以取值时this.$refs.multipleTable.bodyWrapper这样写才能获取到dom节点。

这样大致就可以实现功能了。

过程中遇到个问题

this.$refs.multipleTable.bodyWrapper.addEventListener('scroll', () => {


    let clientHeight = this.clientHeight;
    let scrollTop = this.scrollTop;
    let scrollHeight = this.scrollHeight;

    if(clientHeight + scrollTop + 300 > scrollHeight){
        console.log(clientHeight + scrollTop);
        console.log(scrollHeight);
    }

},true);
复制代码

之前是这样写的,this.clientHeight,this.scrollTop,this.scrollHeight这几个值都能取到,但是赋值却赋不了,没找到是什么原因。

转载于:https://juejin.im/post/5c46e514e51d45518c680388

<think>好的,我现在要帮用户解决在element-uiel-table组件中实现滚动加载的问题。首先,我需要回忆一下element-ui的文档和相关组件。用户提到的是滚动加载,也就是当表格滚动到底部时自动加载更多数据,这在处理大量数据时很常见。 首先,el-table本身是否有滚动事件?我记得el-table有一个body-wrapper的滚动区域,可能需要通过自定义指令或者事件监听来实现滚动监听。不过element-uiel-table可能没有直接提供滚动事件的API,所以可能需要用原生的JavaScript来监听滚动事件。 接下来,用户需要的是滚动到底部时触发加载更多数据。这通常需要判断滚动条是否接近底部。计算滚动容器的scrollTop加上clientHeight是否接近scrollHeight,如果是的话就触发加载。 然后,如何在el-table中找到这个滚动容器呢?根据经验,el-table滚动容器通常是.el-table__body-wrapper这个类名的元素。可以通过ref获取表格实例,然后使用querySelector找到这个元素,并为其添加滚动事件监听器。 另外,还需要考虑防抖处理,避免滚动过程中频繁触发加载函数。可以使用lodash的throttle或者自己写一个setTimeout来延迟执行。 接下来是代码示例。首先,在模板中定义el-table,并设置max-height属性,这样表格才会有滚动条。然后,在mounted生命周期钩子中,找到滚动容器并添加事件监听。在事件处理函数中,判断是否滚动到底部,如果是的话就调用加载数据的方法。 数据加载部分,需要维护一个currentPage变量,每次滚动到底部时currentPage加1,并调用接口获取新数据,然后合并到现有数据中。同时,需要处理加载状态,比如显示“加载中”或者“没有更多数据”的提示。 还需要注意,在组件销毁前,移除滚动事件监听,避免内存泄漏。此外,如果表格数据已经全部加载完毕,应该不再触发加载函数。 测试过程中,可能会遇到滚动容器获取不到的问题,这时候需要确认ref是否正确引用,或者是否在表格渲染完成后再获取DOM元素。另外,max-height的设置是否正确,确保表格确实出现了滚动条。 最后,根据用户的参考引用,虽然引用的内容是关于拖拽排序的,但可能相关的el-table使用技巧可以借鉴,比如操作DOM元素的方法。不过在这个案例中,主要是滚动事件的监听和数据加载的逻辑。</think>在Element-UI的`el-table`中实现滚动加载,可通过监听表格滚动事件判断触底后加载新数据。以下是具体实现步骤和示例: --- ### 一、实现原理 1. **监听滚动容器**:通过`el-table`的`body-wrapper`类获取滚动容器 2. **计算触底条件**:当`scrollTop + clientHeight >= scrollHeight - threshold`时触发加载 3. **数据分页加载**:结合分页参数实现增量加载 4. **防抖处理**:避免高频滚动事件导致重复请求 --- ### 二、代码实现 ```html <template> <el-table ref="myTable" :data="tableData" max-height="400" @scroll="handleScroll"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> <div v-if="loading">加载中...</div> <div v-if="noMore">没有更多数据了</div> </template> <script> export default { data() { return { tableData: [], // 当前表格数据 currentPage: 1, pageSize: 20, total: 0, loading: false, noMore: false } }, mounted() { this.loadData() this.addScrollListener() }, methods: { // 添加滚动监听 addScrollListener() { const tableBody = this.$refs.myTable.$el.querySelector('.el-table__body-wrapper') tableBody.addEventListener('scroll', this.handleScroll) }, // 滚动处理 handleScroll(e) { const { scrollTop, clientHeight, scrollHeight } = e.target const threshold = 50 // 提前触底阈值 if (scrollHeight - (scrollTop + clientHeight) < threshold && !this.loading && !this.noMore) { this.currentPage++ this.loadData() } }, // 加载数据 async loadData() { this.loading = true try { const res = await this.$axios.get('/api/data', { params: { page: this.currentPage, size: this.pageSize } }) this.tableData = [...this.tableData, ...res.data.list] this.total = res.data.total if (this.tableData.length >= this.total) { this.noMore = true } } finally { this.loading = false } } }, beforeDestroy() { // 移除监听 const tableBody = this.$refs.myTable.$el.querySelector('.el-table__body-wrapper') tableBody.removeEventListener('scroll', this.handleScroll) } } </script> ``` --- ### 三、关键点说明 1. **max-height必填**:必须设置表格高度才能触发滚动条 2. **滚动容器选择**:使用`.el-table__body-wrapper`获取正确滚动容器[^1] 3. **阈值控制**:通过`threshold`参数调整触底灵敏度 4. **性能优化**:使用`v-if`控制提示信息避免重复渲染 5. **内存管理**:组件销毁前需移除事件监听 --- ### 四、扩展优化建议 1. **节流处理**:使用lodash的`_.throttle`优化滚动事件 2. **错误重试**:添加请求失败后的重试机制 3. **虚拟滚动**:对于超大数据量建议使用虚拟滚动方案 4. **加载动画**:可结合`el-loading`组件增强交互体验 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值