# virtual-scroll
**Repository Path**: wel1221/virtual-scroll
## Basic Information
- **Project Name**: virtual-scroll
- **Description**: 基于vue的长列表虚拟滚动插件
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 0
- **Created**: 2021-07-04
- **Last Updated**: 2024-09-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 基于vue的长列表虚拟滚动插件
## 1 背景
> 一个长列表 Web 页面,如果需要展示成千上万条数据,那么页面中就会有数万甚至数十万的HTML节点,会巨大的消耗浏览器性能,进而给用户造成非常不友好的体验。
主要体现在以下几个方面:
* 页面等待时间极长,用户体验差;
* CPU 计算能力不够,滑动会卡顿;
* GPU 渲染能力不够,页面会跳屏;
* RAM 内存容量不够,浏览器崩溃。
优化方案:
* 不把长列表数据一次性全部直接显示在页面上;
* 截取长列表一部分数据用来填充屏幕容器区域;
* 长列表数据不可视部分使用使用空白占位填充;
* 监听滚动事件根据滚动位置动态改变可视列表;
* 监听滚动事件根据滚动位置动态改变空白填充。
把上面的优化方案简称为虚拟滚动。
## 2 介绍
虚拟滚动,就是根据 **「 容器可视区域 」** 的 **「 列表容积数量 」**,监听用户滑动或者滚动事件,动态截取 **「 长列表数据 」** 中的 **「 部分数据 」** 渲染到页面上,动态使用空白占位填充容器 **「上下滚动区域内容 」** ,模拟实现 **「 原生滚动效果 」**。

## 3 代码实现
### 3.1 vue组件实现
`VirtualScroll.vue`文件
```vue
```
### 3.2 说明
> 1.使用组件时需要给组件的根元素节点设置可视滚动区域范围,即css样式
>
> 2.只能用于垂直方向上的滚动
#### 3.2.1 参数说明
| 参数 | 说明 | 类型 | 默认值 |
| ---------------- | --------------------------- | ------- | ---------- |
| one-data-height | 一条数据内容的高度 | Number | 0 |
| source-data-list | 所有数据列表 | Array | [],空数组 |
| scroll-flag | 是否向外触发scroll事件 | Boolean | false |
| scroll-last-flag | 是否向外触发scroll-last事件 | Boolean | false |
#### 3.2.2 事件说明
| 事件 | 说明 | 回调参数 |
| ----------- | ---------------------------------------- | -------- |
| scroll | 滚动事,由参数scroll-flag控制 | 滚动位移 |
| scroll-last | 滚动至底事件,由参数scroll-last-flag控制 | —— |
#### 3.2.3 方法说明
| 方法 | 说明 | 参数 |
| ------------ | ------------------------------------------------------------ | -------------------- |
| scrollTo | 设置滚动的目标位置,参数val为要设置的滚动位置数值,参数delay为滚动到目标位置的过渡时间,默认为0,单位为ms | function(val, delay) |
| scrollOffset | 获取滚动位移,方法返回滚动位移的数值 | —— |
#### 3.2.4 作用域slot说明
| slot名称 | 说明 |
| -------- | ---------------------------------- |
| —— | 自定义每条数据的内容,参数为 {row} |
### 3.3封装插件
> 在vue项目的plugins插件目录下创建virtual-scroll目录,并将VirtualScroll.vue文件放入该目录下,然后创建index.js文件。
`index.js`文件
```js
import VirtualScroll from './VirtualScroll.vue'
function install(Vue){
Vue.component('VirtualScroll', VirtualScroll);
}
export default{
install
}
```
## 4 在vue项目中使用
### 4.1 安装虚拟滚动插件
```js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import VirtualScroll from './plugins/virtual-scroll'
Vue.use(VirtualScroll)
Vue.config.productionTip = false
new Vue({
router,
render: h => h(App)
}).$mount('#app')
```
### 4.2 使用虚拟滚动
```vue
```