# 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 介绍 虚拟滚动,就是根据 **「 容器可视区域 」** 的 **「 列表容积数量 」**,监听用户滑动或者滚动事件,动态截取 **「 长列表数据 」** 中的 **「 部分数据 」** 渲染到页面上,动态使用空白占位填充容器 **「上下滚动区域内容 」** ,模拟实现 **「 原生滚动效果 」**。 ![图片](./vscroll.png) ## 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 ```