element-ui中select下拉框加载大数据渲染优化方式

 更新时间:2023年11月09日 10:16:03   作者:donggua_123  
这篇文章主要介绍了element-ui中select下拉框加载大数据渲染优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

现在的前端项目中对于element-ui的使用几乎已经是一个常规动作了,但是组件库中的ui组件不一定都能满足实际场景的需求,比如今天要讲的select下拉框选择组件。

我们公司是做证券行业基础设施的,股票和证券的数量动不动就是上千,当使用select渲染的时候就会很有压力,我司大致3000条数据,全部渲染出来大致需要4s左右,并且多选模式时,选中和反选时会明显感觉卡顿,这在体验上是觉得不能接受的,所以就开始了优化历程。

方案一

把下拉多选功能做成弹框表格多选

可行性:表格设置selection属性,翻页功能可以解决大数据问题

实际情况:需要展示的字段只要2个即可,对于表格来说太少,显得太空;产品也不同意

弃之~~

方案二

利用select的远程搜索功能,初始化只加载指定数量数据,其它数据通过搜索功能查询

可行性:能满足大数据需求,只是体验上打了点折扣,后台也能支持

实际情况:产品能接受

暂时只想到了这两种方案,和后台商量了一下,具有可实施性,于是采用该方案。

方案分析

1.问题的根源是一次性渲染太多数据导致卡顿,那么第一次加载的数据就需要找到一个既能最大限度满足业务需求,又能无感加载的临界值,最终我选了300条

2.输入中文搜索时传递queryName作为模糊查询条件

3.如果通过搜索条件勾选了300条以后的数据,失去焦点,重新获取焦点时,需要将已勾选的数据放到300条数据的最前面,方便用户查看和反选,此时需要用已选择数据的id结合作为查询条件queryIds

4.编辑时后台只会返回新增时添加项对应的id集合,要正确显示对应的name值,需将id集合作为参数请求列表数据,如果不加参数默认返回前300条数据,如果id里有300之后的数据,则不会正确展示。第一次新增时无需传参。

基于以上分析,开始写代码

<!--  -->
<template>
  <div class="container">
    <el-select 
    v-model="selectVal"
    filterable
    multiple
    clearable
    collapse-tags
    remote
    reserve-keyword
    :remote-method='remoteMethod'
    @focus="focus"
    >
      <el-option v-for="(item, index) in options" :key="index"
      :label='item.label'
      :value='item.id'
      >
      </el-option>
    </el-select>
  </div>
</template>
 
<script>
export default {
  data () {
    return {
      selectVal: [],
      options: [
        // {
        //   id: 1,
        //   label: 'one'
        // },
        // {
        //   id: 1,
        //   label: 'one'
        // }
      ]
    };
  },
  mounted() {
    this.getData()
  },
  methods: {
    getData(queryName, queryIds) {
      this.$api('api/get', {
        queryName: queryName || '',
        queryIds: queryIds || '',
      }).then(res => {
        this.options = res.data
      }).catch(err => {
        // dosomething
      })
    },
    remoteMethod(query) {
      // 输入文字模糊搜索,覆盖旧数据
      this.getData(query)
    },
    focus(event) {
      if(!event.sourceCapabilities) return // 如果是勾选或反选下拉选项
      if(!event.target.value) { // 输入框没有搜索条件时触发
        this.getData(undefined, this.selectVal)
      } 
    }
  }
}
 
</script>
<style lang='scss' scoped>
</style>

focus函数是用来解决问题3或者编辑时获取焦点的,但是element-ui的select中点击选项时会触发focus方法,对比了正真的focus和点击,发现只有event.sourceCapabilities值可以区分,便用于区分这两个事件;

如果有搜索条件时也不触发id搜索,只触发默认的remoteMethod即可

新增数据的时候已经可以用了,编辑的时候就会遇到问题4,此时需要用返回的id集合作为参数请求下拉数据,以正确展示已选数据

data () {
    return {
      selectVal: [],
      options: [
        // {
        //   id: 1,
        //   label: 'one'
        // },
        // {
        //   id: 1,
        //   label: 'one'
        // }
      ],
      type: 'edit'
    };
 },
mounted() {
    this.initDialog()
  },
  methods: {
    initDialog() {
      this.getEditInfo(this.type).then(ids => {
        this.selectVal = ids
        this.getData(undefined, ids)
      })
    },
    getEditInfo(type) {
      return new Promise((resolve, reject) => {
        if(type === 'edit') { // 编辑
          this.$api('api/getInfo', {}).then(res => {
            let ids = res.data
            resolve(ids)
          }).catch(err => {
            // dosomething
          })
        }else {
          resolve()
        }
      })
    },
    getData(queryName, queryIds) {
      this.$api('api/getOptions', {
        queryName: queryName || '',
        queryIds: queryIds || '',
      }).then(res => {
        this.options = res.data
      }).catch(err => {
        // dosomething
      })
    },
    remoteMethod(query) {
      // 输入文字模糊搜索,覆盖旧数据
      this.getData(query)
    },
    focus(event) {
      if(!event.sourceCapabilities) return // 如果是勾选或反选下拉选项
      if(!event.target.value) { // 输入框没有搜索条件时触发
        this.getData(undefined, this.selectVal)
      } 
    }
  }

这样就可以满足大数据加载的需求了

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vuex项目中登录状态管理的实践过程

    vuex项目中登录状态管理的实践过程

    由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长,为了解决这个问题,Vue 提供 vuex,这篇文章主要给大家介绍了关于vuex项目中登录状态管理的相关资料,需要的朋友可以参考下
    2021-09-09
  • 如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目

    如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目

    这篇文章主要介绍了如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • vue3.0中使用element的完整步骤

    vue3.0中使用element的完整步骤

    这篇文章主要给大家介绍了关于vue3.0中使用element的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • vue配置font-awesome5的方法步骤

    vue配置font-awesome5的方法步骤

    这篇文章主要介绍了vue配置font-awesome5的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • vue computed的set方法无效问题及解决

    vue computed的set方法无效问题及解决

    这篇文章主要介绍了vue computed的set方法无效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 关于Vue3&TypeScript的踩坑汇总

    关于Vue3&TypeScript的踩坑汇总

    这篇文章主要介绍了关于Vue3&TypeScript的踩坑汇总,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Vue新搭档TypeScript快速入门实践记录

    Vue新搭档TypeScript快速入门实践记录

    TypeScript 是一种由微软开发的自由和开源的编程语言,它是 JavaScript 的一个超集,扩展了 JavaScript 的语法。这篇文章主要介绍了Vue新搭档TypeScript快速入门实践,需要的朋友可以参考下
    2021-06-06
  • vue.js vue-router如何实现无效路由(404)的友好提示

    vue.js vue-router如何实现无效路由(404)的友好提示

    众所周知vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用,下面这篇文章主要给大家介绍了关于vue.js中vue-router如何实现无效路由(404)的友好提示的相关资料,需要的朋友可以参考下。
    2017-12-12
  • 为什么vue中不建议使用空字符串作为className

    为什么vue中不建议使用空字符串作为className

    本文主要介绍了为什么vue中不建议使用空字符串作为className,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Element-UI日期选择器(选择日期范围)禁用未来日期实现代码

    Element-UI日期选择器(选择日期范围)禁用未来日期实现代码

    我们在网页开发时通常需要用到一些日期组件来方便用户选择时间,其中element日期组件是一个非常好用的工具,这篇文章主要给大家介绍了关于Element-UI日期选择器(选择日期范围)禁用未来日期的相关资料,需要的朋友可以参考下
    2024-02-02

最新评论