【业务实例】vue用虚拟列表解决万条数据勾选卡顿问题
为什么需要虚拟列表
日常开发中,经常需要处理一个大数据量的列表,可能是需要展示、勾选等;
如果我们用html原生的标签实现,性能到还好。但是现在大多都是用第三方组件库开发(例如element-ui),以便提升开发效率;
如果我们同时展示、勾选千条数据的时候,页面将会卡主,甚至崩掉;
虚拟列表的方案正是为了解决这类前端大数据量展示、操作卡顿的问题;
虚拟列表原理
虚拟列表只对部分区域进行渲染,对区域外的DOM进行销毁操作。
如果用户上下滚动,那DOM元素就会一直创建、销毁(做好笔记,这是考试重点)。
文章图片
实现多选框组件(万条数据不卡顿)
网上插件很多,不重复造轮子了,本次案例使用的插件 vue-virtual-scroll-list,详细参数配置请查看官网
要实现大数据量的展示和勾选
1.核心点在vue的 mixins 中注册事件 dispatch (这是官网的案例代码);
2.在组件中使用 $on 订阅虚拟滚动插件 data-component 的勾选事件;
3.在虚拟列表的子组件中,在mounted钩子改变勾选状态,因为随着列表滚动,子组件在不断被创建、销毁;’
tips:相关知识,请查看相应链接。本案例未实现默认值、全选等功能,你可以根据实际业务,对组件二次改造。
调用效果及代码
文章图片
全局混入mixins(核心代码)
/*
* @Date: 2022-01-07 16:21:56
* @Author: surewinT 840325271@qq.com
* @LastEditTime: 2022-05-13 22:25:00
* @LastEditors: surewinT 840325271@qq.com
* @Description: mixin 混入
*/
import Vue from 'vue'Vue.mixin({
data() {
return {}
},
methods: {
// 组件事件传递
dispatch(componentName, eventName, ...rest) {
let parent = this.$parent || this.$root
let name = parent.$options.name
while (parent && (!name || name !== componentName)) {
parent = parent.$parent
if (parent) {
name = parent.$options.name
}
}
if (parent) {
parent.$emit.apply(parent, [eventName].concat(rest))
}
}
}
})
组件源码(p-virtual-check)
目录结构
├── p-virtual-check
├── index.vue# 组件入口
├── listItem.vue# 子组件-勾选框
index.vue
.check-virtual-list {
height: 400px;
width: 200px;
overflow: auto;
padding: 0 10px;
}
listItem.vue
{{ source.label }}
实现穿梭框组件(万条数据不卡顿) 穿梭框组件的核心代码跟上述的多选框组件一致,只不过多了搜索、勾选去重等功能,整体的功能更为复杂;
你可以根据实际业务,添加插槽、修改默认值等;
调用效果及代码
文章图片
组件源码(p-virtual-transfer)
目录结构
├── p-virtual-transfer
├── index.vue# 组件入口
├── listItem.vue# 子组件-勾选框
├── virtualList.vue# 子组件-列表
index.vue
.root {
display: flex;
flex: 1;
width: 910px;
.game-left {
border-right: 1px dashed #ccc;
}
.game-btn {
display: flex;
align-items: center;
margin: 0 10px;
}
}
listItem.vue
{{ source[dataLabel] }}
virtualList.vue
{{ title }}
{{ checkNum }}
.check-root {
border: 1px solid #ebeef5;
.header {
padding: 0 20px;
height: 40px;
line-height: 40px;
background-color: #f5f7fa;
display: flex;
justify-content: space-between;
.num {
color: #909399;
}
}
.search {
padding: 5px 20px;
::v-deep .el-input__inner {
border-radius: 10px;
}
}
.main {
background-color: #fff;
padding: 0 10px;
.check-virtual-list {
height: 400px;
overflow: auto;
padding: 0 10px;
}
}
}
仓库源码 【【业务实例】vue用虚拟列表解决万条数据勾选卡顿问题】p-virtual-check
p-virtual-transfer
推荐阅读
- Android-Java-接口Interface
- Android-Java-子类实例化过程(内存图)
- Android-Java-饿汉式单例模式(内存图)
- Android-Java-静态变量
- 有关状压DP
- 【理论积累】C语言基础理论知识【第一版】
- 【已处理】微信零钱支付额度20万用完了怎样办?_微信
- weblogic中优先加载应用中的jar包 prefer-application-packages
- Delphi使用iTools安卓模拟器
- {调取该文章的TAG关键词}|证监会发布《证券公司科创板股票做市交易业务试点规定》