本文分享自华为云社区《解决el-select数据量过大的卡顿的两种思路与一种实施方案》,作者: KevinQ。

经典问题:在测试环境好好的,怎么到正式环境就不行了?

——本文:数据量变了。

问题来源

最近在开发公司的后台管理系统,很简单的一个部分,给部门设置领导,前端选用Element-UI的 el-select组件,后端返回的可选人员列表为当前操作人有权控制的每一个人。

在测试环境运行好好的,怎么到了正式环境就不行了呢?

问题分析

出问题的原始代码很简单:

<el-select
v-model="orgForm.leader"
placeholder="请选择部门领导"
style="width: 15vw"
clearable
multiple
filterable
>
<el-option
v-for="(l, index) in leaderOptions"
:key="index"
:label="l.realname"
:value="l.id"
/>
</el-select>

问题出在测试环境时,el-select的可选数据 leaderOptions的量级顶多100多人,而到了正式生产环境中,leaderOptions达到了将近两万左右,从而造成了组件卡顿。

因此,解决问题的方式就是,如何降低el-select的可选项 leaderOptions的数量。

两种解决思路

我们认为有两种解决思路:

前后端配合

这种方式的优点是,思路清晰简单,修改后台接口的返回数据量,每次查询只返回100条数据,毕竟从使用上来说,不会真的有人一直下拉来选择。

这种方式的缺点是,出现问题的是前端,却需要后端来解决,增加了后端的工作量,或者说,将一个领域的问题扩展到另一个领域的人员去解决,会增加团队沟通成本。

因此,我们放弃了这种方式。(其实就是懒得沟通,就想自己解决问题,不麻烦别人!)

纯前端解决

为了减少 el-select的可选项数量,我们构造数据:leaderOptionsTop30, 每次只返回所有可选项的(大约)30条数据,那么这大约30条数据是根据什么来筛选获的呢?

我们设置el-select的 filter-method:

<el-select
v-model="orgForm.leader"
placeholder="请选择部门领导"
style="width: 15vw"
clearable
multiple
filterable
:filter-method="filterCheckPerOptions"
>
<el-option
v-for="(l, index) in leaderOptionsTop30"
:key="index"
:label="l.realname"
:value="l.id"
/>
</el-select>

方法体:

filterCheckPerOptions(query = '') {
// query是输入框中的检索条件
var arr = this.leaderOptions.filter(item => {
return !this.$method.isEmpty(item.realname) && item.realname.includes(query)
})
// 根据检索条件筛选出来的选项,只取前30条
if (arr.length > 30) {
arr = arr.slice(0, 30)
}
// 清空之前的选项
this.leaderOptionsTop30.splice(0, this.leaderOptionsTop30.length)
// chosen表示已被选择的选项,添加这一部分主要是为了回显,避免选择框中直接出现用户id
const chosen = this.getChosenItemsArr()
// 检索项 + 已选项的并集
const result = [...arr, ...chosen.filter(item => !arr.includes(item))]
if (arr.length > 30) {
this.leaderOptionsTop30.push(...result)
} else {
this.leaderOptionsTop30.push(...result)
}
},
getChosenItemsArr() {
// 获取已被选中的人员
const items = []
for (let i = 0; i < this.leaderOptions.length; i++) {
if (this.orgForm.leader.indexOf(this.leaderOptions[i].id) >= 0 &&
items.indexOf(this.leaderOptions[i]) < 0) {
items.push(this.leaderOptions[i])
}
}
return items
},

打完,收工!

题外话

正式环境运行与测试环境运行结果不同,通常有很多原因,例如:

  1. 服务器:如服务器的时区,语言等配置不同,可能导致某些未指定特定语言或时区的代码在执行时出现不一致的情况。
  2. 数据配置:大多数功能上线后都需要进行后台的数据配置,这一点相信无须多言。
  3. 数据量:

数据量会影响接口的响应速度,页面组件的响应速度等等。比如某个操作需要等待后台接口,而后台接口如果超过一定时长后,前端用户就会明显的感觉操作的卡顿与无响应。

点击关注,第一时间了解华为云新鲜技术~

el-select数据量过大引发卡顿,怎么办?的更多相关文章

  1. 针对数据量较大的表,需要进行跨库复制,采用navcat 实现sqlite数据库跨数据库的数据表迁移 [转载]

    2014年12月13日 14:36 新浪博客 (转自http://www.cnblogs.com/nmj1986/archive/2012/09/17/2688827.html) 需求: 有两个不同的 ...

  2. sql查询未走索引问题分析之查询数据量过大

    前因: 客户咨询,有一个业务sql(代表经常被执行且重要),全表扫描在系统占用资源很高(通过ash报告查询得到信息) 思路: 1.找到sql_text,sql_id 2.查看执行计划 3.查询sql涉 ...

  3. sql server 大数据, 统计分组查询,数据量比较大计算每秒钟执行数据执行次数

    -- 数据量比较大的情况,统计十分钟内每秒钟执行次数 ); -- 开始时间 ); -- 结束时间 declare @num int; -- 结束时间 set @begintime = '2019-08 ...

  4. Mysql数据量较大时分页查询优化

    据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id 是主键,vtype是int,vtype是索引. 最后co ...

  5. 斯坦福大学公开课机器学习:machine learning system design | data for machine learning(数据量很大时,学习算法表现比较好的原理)

    下图为四种不同算法应用在不同大小数据量时的表现,可以看出,随着数据量的增大,算法的表现趋于接近.即不管多么糟糕的算法,数据量非常大的时候,算法表现也可以很好. 数据量很大时,学习算法表现比较好的原理: ...

  6. 系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法

    系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法

  7. phpmyadmin 打开数据表较多,数据量较大的数据库时出现超时的解决办法

    用phpmyadmin打开数据表较多,数据量较大的数据库时,会出现超时,或者等半天打开了说数据库没有表.并且即便打开了,再进行其他浏览,编辑,sql等操作,页面也是相当慢的,慢等几乎无法忍受.这里慢也 ...

  8. Java模拟数据量过大时批量处理数据的两种实现方法

    方法一: 代码如下: import java.util.ArrayList; import java.util.List; /** * 模拟批量处理数据(一) * 当数据量过大过多导致超时等问题可以将 ...

  9. 解决mysql导入数据量很大导致失败及查找my.ini 位置(my.ini)在哪

    数据库数据量很大的数据库导入到本地时,会等很久,然而等很久之后还是显示失败: 这是就要看看自己本地的没mysql是否设置了超时等待,如果报相关time_out这些,可以把mysql.ini尾部添加ma ...

随机推荐

  1. Python 每日提醒写博客小程序,使用pywin32、bs4库

    死循环延迟调用方法,使用bs4库检索博客首页文章的日期是否与今天日期匹配,不匹配则说明今天没写文章,调用pywin32库进行弹窗提醒我写博客.

  2. 2021-ACM-ICPC-济南站 K Search For Mafuyu 【树的遍历与回溯,dfs, 邻接表】

    PAT 题目详情 (pintia.cn) 题目 题意描述 n个房间, 有n-1个通道, kanade初始在1,Mafuyu 位置未知,求K到M的最小期望,也就是到每个地方的平均值,注意的是这里的求法, ...

  3. 2021.10.29 数位dp

    2021.10.29 数位dp 1.数字计数 我们先设数字为ABCD 看A000,如果我们要求出它所有数位之和,我们会怎么求? 鉴于我们其实已经求出了0到9,0到99,0到999...上所有数字个数( ...

  4. Java第十周作业

    1.编写一个方法,实现冒泡排序(由小到大),并调用该方法 package gc; public class gc { /** * @param args */ public static void m ...

  5. 11.Flink实时项目之支付宽表

    支付宽表 支付宽表的目的,最主要的原因是支付表没有到订单明细,支付金额没有细分到商品上, 没有办法统计商品级的支付状况. 所以本次宽表的核心就是要把支付表的信息与订单明细关联上. 解决方案有两个 一个 ...

  6. 【FAQ】HMS Core推送服务与本地创建通知消息如何相互覆盖?

    我们知道,单独使用HMS Core推送服务或本地创建通知消息,都可以实现通知消息的覆盖,方式分别为: 1.本地创建通知消息(简称本地通知消息) 通过notificationManager.notify ...

  7. 听说Integer有bug?1000不等于1000?

    bug? 前几天有位朋友找我,说:"老哥,老哥,我好像发现了Integer一个bug,你帮我看看什么情况?",说完给了我两个很简单的demo,上代码. 100 == 100 100 ...

  8. 【第二课】从零开始学习Linux(学习笔记)

    之前工作会接触Linux,会常用的命令和服务,看过一些书,缺乏系统的学习和整理,现在放空自己,从零开始学习. 每日学习打卡: 2022-04-04

  9. FreeRTOS --(8)任务管理之创建任务

    转载自https://blog.csdn.net/zhoutaopower/article/details/107034995 在<FreeRTOS --(7)任务管理之入门篇>文章基本分 ...

  10. stm32F103C8T6通过写寄存器点亮LED灯

    因为我写寄存器的操作不太熟练,所以最近腾出时间学习了一下怎么写寄存器,现在把我的经验贴出来,如有不足请指正 我使用的板子是stm32F103C8T6(也就是最常用的板子),现在要通过写GPIO的寄存器 ...