iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >element select怎么实现组件虚拟滚动优化
  • 211
分享到

element select怎么实现组件虚拟滚动优化

2023-07-06 01:07:08 211人浏览 薄情痞子
摘要

本篇内容介绍了“element select怎么实现组件虚拟滚动优化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不知道

本篇内容介绍了“element select怎么实现组件虚拟滚动优化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

不知道大家在开发过程中有没有遇到这样一个场景,后端接口一次性返回上千条数据(比如国家地区),接口不支持分页,不能筛选,只能前端自己通过 select 组件全量渲染出来。这种渲染大量 DOM 的场景下会造成页面非常卡顿,我在网上搜索了一下一般有两种解决方案

  • 前端自己实现数据分页效果

  • 虚拟滚动,比如 element plus 就有专门的 select 虚拟滚动组件

最好的方案当然时直接使用成熟的轮子,奈何我们的项目Vue 2.7,所以只能借助支持 vue2 的虚拟滚动组件 vue-virtual-scroll-list,自己封装一个 select 虚拟滚动组件

组件实现

首先在项目中引入 vue-virtual-scroll-list

npm i vue-virtual-scroll-list

接下来开发封装虚拟滚动组件,因为使用的是 vue2.7 版本,为了以后项目升级 vue3,所以直接使用 composition api 的方式开发。在 el-select 组件内部引入安装好的 vue-virtual-scroll-list,定义好组件的基础结构,和需要传入的 props 属性

<template>  <el-select    v-model="value"    v-bind="$atts"    v-on="$listeners"  >    <virtual-scroll-list      ref="virtualListRef"    ></virtual-scroll-list>  </el-select></template><script setup>  import VirtualScrollList from 'vue-virtual-scroll-list'  const props = defineProps({    // 当前    value: {      type: [String, Number],      default: '',    },    // 下拉展示的 options    options: {      type: Array,      default: () => [],    },    // label 键值    labelkey: {      type: String,      default: 'label',    },    // value 键值    valueKey: {      type: String,      default: 'value',    },  })  const { value, options, labelKey, valueKey } = toRefs(props)  const virtualListRef = ref(null)</script>

根据官网文档描述,有三个必填属性,data-key, data-sources, data-component,我们可以直接选取 value 作为唯一的 data-keydata-sources 就是我们传入的 options,data-component 需要我们将 el-option 封装为一个独立的组件

属性是否必填默认值类型描述
data-key必填
String | Function虚拟滚动列表每一项的唯一 id,如果是函数的话需要返回 string
data-sources必填
Array[Object]虚拟滚动的数据列表,每个数组项必须是对象,并且每个对象必须有一个唯一的属性与 data-key 匹配
data-component必填
Component虚拟滚动每一项的渲染组件
keeps非必填30Number虚拟列表展示的真实 DOM 的数量
extra-props非必填{}Object传递给子组件的额外参数

我们先将 el-option 封装为一个独立组件,需要注意的是 vue-virtual-scroll-list 默认传入是数组是 source,所以需要从 source 属性中根据 labelKey 和 valueKey 找到需要加载的 label 和 value

<template>  <el-option     :key="value"     :label="label"     :value="value"     v-bind="$atts"    v-on="$listeners"   /></template><script setup>  import { computed, toRefs } from 'vue'  const props = defineProps({    source: {      type: Object,      default: () => {},    },    valueKey: {      type: [String, Number],      default: '',    },    labelKey: {      type: String,      default: '',    },  })  const { source, valueKey, labelKey } = toRefs(props)  const value = computed(() => source.value[valueKey.value])  const label = computed(() => source.value[labelKey.value])</script>

接着在父组件中引入封装的 el-option 组件,这里我们取名为 Optionnode,然后传入 data-key, data-sources, data-component 三个必填属性,同时将 labelKey 和 valueKey 通过 extra-props 属性传递给子组件。vue-virtual-scroll-list 组件需要显式设置列表的高度和滚动条,不然在元素过多时会出现列表过长的情况,同时为了配合项目,这里我将 keeps 属性设置为 20,也就是只渲染 20 个真实 DOM 节点

<template>  <fe-select    v-model="value"    v-bind="$atts"    v-on="$listeners"  >    <virtual-scroll-list      ref="virtualListRef"+     class="virtual-scroll-list"+     :data-key="dataKey"+     :data-sources="allOptions"+     :data-component="OptionNode"+     :keeps="20"+     :extra-props="{+       labelKey,+       valueKey,+     }"    ></virtual-scroll-list>  </fe-select></template><script setup>  import { toRefs, ref, nextTick, computed, watch, onMounted } from 'vue'  import VirtualScrollList from 'vue-virtual-scroll-list'+ import OptionNode from './option-node.vue'  const props = defineProps({    value: {      type: [String, Number],      default: '',    },    options: {      type: Array,      default: () => [],    },    labelKey: {      type: String,      default: 'label',    },    valueKey: {      type: String,      default: 'value',    },  })  const { value, options, labelKey, valueKey } = toRefs(props)  const virtualListRef = ref(null)+ const dataKey = ref(valueKey)+ const allOptions = options.value</script>+ <style lang="sCSS" scoped>+   .virtual-scroll-list {+     height: 200px;+     overflow: auto;+   }+ </style>

这个时候就可以初步实现虚拟列表滚动的效果了,但由于虚拟滚动仅渲染部分 DOM,所有还有两个问题需要考虑

  • 保存了选择项后,再二次加载时,需要显示保存项,这时需要从完整 options 中找到保存项并放在列表最上面

  • 筛选列表选项时,需要从完整 options 找到符合要求的选项并加载,同时在关闭列表时,需要重置列表

针对以上两个问题,我们引入一个 currentOptions 记录当前的 options,通过 remote-method 实现搜索效果,通过 visible-change 事件实现重置列表。经过优化后的代码如下

<template>  <fe-select    v-model="value"+   filterable+   remote+   :remote-method="handleRemoteMethod"    v-bind="$atts"+   @visible-change="handleVisiableChange"    v-on="$listeners"  >    <virtual-scroll-list      ref="virtualListRef"      class="virtual-scroll-list"      :data-key="dataKey"      :data-sources="currentOptions"      :data-component="OptionNode"      :keeps="20"      :extra-props="{        labelKey,        valueKey,      }"    ></virtual-scroll-list>  </fe-select></template><script setup>  import { toRefs, ref, nextTick, computed, watch, onMounted } from 'vue'  import VirtualScrollList from 'vue-virtual-scroll-list'  import OptionNode from './option-node.vue'+ import { cloneDeep, isNil } from 'lodash-es'  const props = defineProps({    value: {      type: [String, Number],      default: '',    },    options: {      type: Array,      default: () => [],    },    labelKey: {      type: String,      default: 'label',    },    valueKey: {      type: String,      default: 'value',    },  })  const { value, options, labelKey, valueKey } = toRefs(props)  const virtualListRef = ref(null)  const dataKey = ref(valueKey)+ // 当前筛选的 options+ const currentOptions = ref([])+ // 全量 options+ // 注意这里需要深拷贝+ const allOptions = computed(() => cloneDeep(options.value))+ onMounted(() => {+   handleInitOptions(allOptions.value, value.value)+ })+ watch([value, options], ([newVal, newOptions], [_oldVal, oldOptions]) => {+   // 异步加载 options 时,如果 value 有值,需要将 value 对应的 option 放在第一位+   if ((!isNil(newVal) || newVal !== '') && newOptions.length > 0 && oldOptions.length === 0) {+     handleInitOptions(newOptions, newVal)+   }+ })+ + function handleRemoteMethod(query) {+   if (query !== '') {+     currentOptions.value = allOptions.value.filter((item) => {+       return item[labelKey.value].includes(query)+     })+   } else {+     currentOptions.value = allOptions.value+   }+ }+ function handleVisiableChange(val) {+   // 隐藏下拉框时,重置数据+   if (!val) {+     virtualListRef.value && virtualListRef.value.reset()+     nextTick(() => {+       currentOptions.value = allOptions.value+     })+   }+ }+ + function handleInitOptions(allOptions, value) {+   const existOption = allOptions.find((item) => {+     return item[valueKey.value] === value+   })+   if (existOption) {+     currentOptions.value.push(existOption)+   }+   currentOptions.value.push(+     ...allOptions.filter((item) => {+       return item[valueKey.value] !== value+     })+   )+ }</script><style lang="scss" scoped>  .virtual-scroll-list {    height: 200px;    overflow: auto;  }</style>

“element select怎么实现组件虚拟滚动优化”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: element select怎么实现组件虚拟滚动优化

本文链接: https://www.lsjlt.com/news/356787.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • element select怎么实现组件虚拟滚动优化
    本篇内容介绍了“element select怎么实现组件虚拟滚动优化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不知道...
    99+
    2023-07-06
  • elementselect实现组件虚拟滚动优化
    目录组件实现总结不知道大家在开发过程中有没有遇到这样一个场景,后端接口一次性返回上千条数据(比如国家地区),接口不支持分页,不能筛选,只能前端自己通过 select 组件全...
    99+
    2023-05-15
    element select滚动优化 element select 优化
  • vue怎么实现虚拟滚动
    小编给大家分享一下vue怎么实现虚拟滚动,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言移动端网页的日常开发中,偶尔会包含一些渲染长列表的场景.比如某旅游网站需...
    99+
    2023-06-20
  • element中ScrollBar滚动组件怎么用
    这篇文章将为大家详细讲解有关element中ScrollBar滚动组件怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。scrollbar组件根目录下包括index.j...
    99+
    2024-04-02
  • vue怎么实现虚拟滚动效果
    这篇文章主要讲解了“vue怎么实现虚拟滚动效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue怎么实现虚拟滚动效果”吧!效果图:滚动原理为了理解虚拟滚动...
    99+
    2024-04-02
  • Selenium怎么实现页面虚拟滚动和无限滚动
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • vue.js el-table虚拟滚动效果怎么实现
    今天小编给大家分享一下vue.js el-table虚拟滚动效果怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-04
  • element怎么用脚本自动化构建新组件
    这篇文章主要为大家展示了“element怎么用脚本自动化构建新组件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“element怎么用脚本自动化构建新组件”这篇文章吧。element-ui的自动化...
    99+
    2023-06-22
  • vue2.0结合Element怎么实现select动态控制input禁用
    这篇文章主要为大家展示了“vue2.0结合Element怎么实现select动态控制input禁用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue2.0结合...
    99+
    2024-04-02
  • element用脚本自动化构建新组件的实现示例
    目录背景element-ui的自动化构建是怎么做的makefilenew.jsfile-save引用资源文件的修改fs.createWriteStream总结背景 在公司的项目中,...
    99+
    2024-04-02
  • Vue中Element分组+多选+可搜索Select选择器怎么实现
    这篇文章主要为大家展示了“Vue中Element分组+多选+可搜索Select选择器怎么实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue中El...
    99+
    2024-04-02
  • Vue.js中怎么实现一个上下滚动加载组件
    今天就跟大家聊聊有关Vue.js中怎么实现一个上下滚动加载组件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。组件代码// scrollLo...
    99+
    2024-04-02
  • vue3怎么集成Element-plus实现按需自动引入组件
    本文小编为大家详细介绍“vue3怎么集成Element-plus实现按需自动引入组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3怎么集成Element-plus实现按需自动引入组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
    99+
    2023-07-02
  • 云服务器虚拟化怎么实现
    云服务器虚拟化的实现可分为CPU虚拟化、内存虚拟化、设备、I/O和网口虚拟化和实时迁移技术。CPU虚拟化将一个物理CPU虚拟成一个虚拟CPU,一个物理CPU只能处理一个虚拟CPU的指令,不能对应多个虚拟CPU的指令。操作系统可以使用一个或多...
    99+
    2024-04-02
  • Vue.js组件化怎么实现
    本文小编为大家详细介绍“Vue.js组件化怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue.js组件化怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在这个组织复杂界面问题中,Vue 与 Re...
    99+
    2023-06-27
  • Linux中的虚拟化技术怎么实现
    Linux中常用的虚拟化技术有KVM(Kernel-based Virtual Machine)、Xen、Docker等。 KVM是...
    99+
    2024-04-09
    Linux
  • elementUI select组件默认选中效果怎么实现
    这篇文章主要介绍了elementUI select组件默认选中效果怎么实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先,v-model...
    99+
    2024-04-02
  • WPF怎么使用WrapPanel实现虚拟化效果
    在WPF中,WrapPanel并不支持虚拟化(UI虚拟化)效果,所以无法直接使用WrapPanel来实现虚拟化效果。UI虚拟化是一种...
    99+
    2024-04-09
    WPF WrapPanel
  • 怎么在Vue中使用better-scroll组件实现横向滚动功能
    怎么在Vue中使用better-scroll组件实现横向滚动功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、滚动的实现原理better-scroll的滚动...
    99+
    2023-06-15
  • Vue基于Element-ui怎么实现表格弹窗组件
    本篇内容主要讲解“Vue基于Element-ui怎么实现表格弹窗组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue基于Element-ui怎么实现表格弹窗组件”吧!效果图使用方式acTab...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作