# infinite-scroll-table
**Repository Path**: zyl-ll/infinite-scroll-table
## Basic Information
- **Project Name**: infinite-scroll-table
- **Description**: 基于vue2+elementUI的无线滚动表格组件
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 3
- **Created**: 2022-05-24
- **Last Updated**: 2025-04-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 无限滚动组件说明
这是一个针对 vue2 和 elementUI 的无限滚动组件,可实现虚拟加载。
## 概要
### 特点一 滚动加载
本组件针对 el-table,获取 el-table 中的 table_wraper 元素,并添加滚动监听事件。
滚动到底部时调用加载方法,添加更多数据到维护的数组(scrollData)中。
### 特点二 虚拟列表
本组件,初始化时根据传入的每行最小高度值(itemHeight)计算出当前列表最多能展示多少行数据。
之后每次滚动并不会渲染维护数组(scrollData)中的所有数据,而是根据当前滚动的距离来渲染出对应的数据。
这样的好处是节约 dom 开销,提升性能。
### 特点三 不定高的列表
vue 的表格中每一行数据可能存在换行导致高度不一致,也就是每一行的高度是不定高的。这里组件仍然可以正确渲染。
### 注意
本组件只针对使用 vue2 和 elementUI 的项目
## 安装
`npm install infinite-scroll-table`
## 使用方法
在 main.js 中引入
```js
import InfiniteScrollTable from "infinite-scroll-table";
Vue.use(InfiniteScrollTable);
```
在组件中使用
InfiniteScrollTable 组件包裹 el-table 组件,然后
**传入三个配置:**
- 列表维护数据的总数组:scrollData
- 加载更多数据的方法:getMoreData
- 滚动的相关配置:loadConfig
**侦听一个事件:**
- 侦听 setTableData 事件,该事件会返回一个数组,表示当前滚动距离应该显示的数据。
**加载方法说明:**
getMoreData 对应加载更多数据的方法。这个方法一般是 ajax 请求,也就是异步的方法。
为了组件控制加载的过程,我们需要在请求前,调用组件的`loadStart`方法,
请求结束后调用组件的`loadEnd`方法。
如下代码中使用 ref 标记了组件,加载前后分别调用了`this.$refs.ref_infinite_table.loadStart()` 和 `this.$refs.ref_infinite_table.loadEnd()`
并且加载结束后注意设置 loadConfig 中的 totalCount 的值,以便于组件判断已经加载完了。
详细介绍,参见下方配置详解。
完整示例:
```vue
```
## 配置详解
### loadConfig
示例:
```js
loadConfig: {
loadingText: '玩命加载中', // 加载时提示文字
overText: '你已经碰到我的底线了(没有更多数据)', // 所有数据加载完毕后显示文字
totalCount: 0, // 传totalCount 或者 isOver ========== 重要
isOver: false, // 传isOver或者 totalCount ========== 重要
itemHeight: 40, // 每一行数据的最小高度,不传默认40
distance: 40 // 滚动条距离底部并触发滚动加载的距离 不传 则默认为20
}
```
### setTableData
为了节约 dom 的开销,我们尽量只渲染当前容器你能看到的数据。而`el-table`组件绑定的 data 你传入多少数据,就会显示多少数据。
所以我们把所有的数据放在 scrollData 中,通过 setTableData 事件传递出当前应该显示的数据给 tableData。
所以拿到 setTableData 传出的数据,直接赋值给 el-table 绑定的 data 就好了。
示例:
```js
setTableDataFn(arr) {
this.tableData = arr; // tableData 是el-table绑定的data
},
```
### 组件可被调用的几个方法
- infiniteLoadStart 加载数据前调用 ========== 重要
- infiniteLoadEnd 加载数据结束时调用 ========== 重要
- scrollToTop 滚动到顶部
- scrollToNextPage 滚动到下一页
- scrollToPrePage 滚动到上一页
- updateTableSize 传入的元素尺寸变化时调用
使用$refs['这个组件的 ref 名称'].fn() 来调用,fn 对应上述一个方法。
### 其它传参
- showTopBtn 是否展示回到顶部的按钮(滚动到下方才会展示)
- showBottomBar 是否展示下方表示加载状态的横条
- loadImmediate 表格数据不足以滚动时 是否立刻加载更多数据
### 注意点
isOver 或 totalCount 只用一种来控制是否结束
## 其它
本组件还支持一种便捷用法,在`el-table`上直接使用`v-tableScrollLoad`指令来让表格可以滚动加载。这个指令绑定一个加载数据的方法。
使用实例:
```html
// loadingFn是加载数据的方法
```
注意点:
- 初始的 tableData 如果为 0,无法触发滚动,所以第一次查询需要写个额外的方法
- 为了避免重复加载,应该自行在 loadingFn 方法中判断是否正在查询,是否所有加载结束.
- 此方法默认触发滚动距离是 20,可通过给`v-tableScrollLoad`指定传参来更改,如:`v-tableScrollLoad[40]="loadingFn"`