文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Element 穿梭框性能优化

2024-12-03 00:07

关注

element 穿梭框性能优化

背景

穿梭框处理大数据量时,由于渲染的 DOM 节点过多,造成页面卡顿的问题。在尽量不改变组件原有逻辑的前提下,进行优化。

解决思路

懒加载 - InfiniteScroll 组件

先从 packages/transfer 中将原组件拷出(或者改源码重新打包维护私有库使用

  1. v-infinite-scroll="pageDown" 
  2. :infinite-scroll-immediate="false" 

添加到

  1. group 
  2.         v-show="!hasNoMatch && data.length > 0" 
  3.         v-model="checked" 
  4.         :size="size" 
  5.         :class="{ 'is-filterable': filterable }" 
  6.         class="el-transfer-panel__list" 
  7.         v-infinite-scroll="pageDown" 
  8.         :infinite-scroll-immediate="false" 
  9.       > 
  10.         
  11.           class="el-transfer-panel__item" 
  12.           :label="item[keyProp]" 
  13.           :disabled="item[disabledProp]" 
  14.           :key="item[keyProp]" 
  15.           v-for="item in filteredData"
  16.             <option-content :option="item">option-content> 
  17.          
  18. group

 

 

在data中定义pageSize: 20 用来表示每页数据个数showData: [] 仅用来展示使用,替换上述代码中实际需要操作的数据 filteredData

  1. v-for="item in showData"

同时在watch中相应的处理

  1. data (data) { 
  2.     const checked = []; 
  3.     this.showData = data.slice(0, this.pageSize); 
  4.  
  5.     const filteredDataKeys = this.filteredData.map( 
  6.     (item) => item[this.keyProp] 
  7.     ); 
  8.     this.checked.forEach((item) => { 
  9.     if (filteredDataKeys.indexOf(item) > -1) { 
  10.         checked.push(item); 
  11.     } 
  12.     }); 
  13.     this.checkChangeByUser = false
  14.     this.checked = checked; 
  15. }, 
  16. filteredData (filteredData) { 
  17.     this.showData = filteredData.slice(0, this.pageSize); 
  18.  } 

初始化展示数量随意这里取 20。

最后添加滚动到底部时调用的方法

  1. pageDown () { 
  2.     const l = this.showData.length; 
  3.     const totalLength = this.filteredData.length 
  4.     l < totalLength &&  
  5.     (this.showData = this.filteredData.slice(0, l + this.pageSize > totalLength ? 
  6.     totalLength : l + this.pageSize)); 
  7. }, 

往下滚动的时候 展示的数据长度增加 20(数量随意), 超出时展示最大长度。

由此基本解决大数据量操作卡顿的问题。由于展示和逻辑层分开,组件的所有操作逻辑无须修改,最小程度减少差异。

新问题

手动滚动到列表末端,再进行搜索操作依然存在卡顿问题。

进阶

在滚动过程中,实际上顶端的数据依旧无法看见,该数据不展示,对用户体验也没有影响, 所以只需展示当前页的 20 条数据。我们为el-checkbox-group添加一个 ref=scrollContainer 以便操作滚动条,

在data中定义当前页数 curIndex: 1

并对 pageDown 方法进行修改

  1. pageDown () { 
  2.   const totalLength = this.filteredData.length 
  3.   if((this.curIndex*this.pageSize) < totalLength){ 
  4.     this.curIndex ++ 
  5.     const targetLength = this.curIndex * this.pageSize  
  6.     const endPoint = targetLength > totalLength ? totalLength : targetLength 
  7.     const startPoint = endPoint - this.pageSize  > 0 ? endPoint - this.pageSize : 0 
  8.     this.showData = this.filteredData.slice(startPoint, endPoint); 
  9.     this.$refs.scrollContainer.$el.scrollTop = "1px" //滚动条到最上端,衔接下一页,为 0 可能会触发边界问题 
  10.   } 

为此我们还需要添加向上翻页的方法 InfiniteScroll 指令 只提供向下滚动,我们可以拓展该指令亦可自行添加上滑滚动监听

  1. mounted(){ 
  2.         this.$refs.scrollContainer.$el.addEventListener('scroll', this.pageUp) 
  3.     }, 
  4.     beforeDestroy(){ 
  5.         this.$refs.scrollContainer.$el.removeEventListener('scroll', this.pageUp) 
  6.     }, 

注册pageUp 方法

  1. pageUp(e){ 
  2.       if(e.target.scrollTop ===0 && this.curIndex>1){ 
  3.         this.curIndex -- 
  4.         const endPoint = this.curIndex * this.pageSize  
  5.         const startPoint = (this.curIndex-1)* this.pageSize  
  6.         this.showData = this.filteredData.slice(startPoint, endPoint); 
  7.         const el = this.$refs.scrollContainer.$el 
  8.         el.scrollTop = el.scrollHeight - el.clientHeight - 1 // 滚动到最底部,衔接上一页, -1 防止边界问题。 
  9.       } 
  10.     }, 

当进行数据操作的时候,页面内容变化,滚动条也会随之变化,为防止不能预知的翻页,数据改变时,重置滚动条和当前页码。

  1. initScroll(){ 
  2.         this.curIndex = 1 
  3.         this.$refs.scrollContainer.$el.scrollTop = 0 
  4.     }, 

同时地,在watch中相应时候执行 initScroll

  1. data(){ 
  2.       ... 
  3.       this.initScroll() 
  4.       ... 
  5.   }, 
  6.   filteredData (filteredData) { 
  7.     ... 
  8.     this.initScroll() 
  9.   } 

 

至此大数据量的穿梭框,性能大为改善。

 

来源:微医大前端技术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯