当前位置:   article > 正文

【项目笔记】:elementui下拉框数据太多造成页面卡顿怎么解决?_vue下拉框数据太大加载慢

vue下拉框数据太大加载慢

一.前言

        开发过程中未出现卡顿现象,在测试的时候出现了卡顿现象,下拉框压根打不开,针对这个问题做了以下优化。

二.解决办法

  1. 首先可以用原生js封装一个下拉框,这样确实能提高前端性能,但是不多,我说实话。
  2. 每次进来加载默认值(上一次选的值)的后十条数据,这样的话我觉得可能就是数据不卡了,但是明显多了http请求,不符合雅虎三十五军规。
  3. 下拉框做数据懒加载

三.下拉框数据做懒加载

思路:通过监听下拉框的滚动条进行加载下拉框数据。针对下拉框搜索功能,我们做了节流。下面是一个小demo,可以根据需求选取有用的片段。

废话不多说,上菜!

html代码:

  1. <el-select v-model="form.value" filterable v-el-select-loadmore="loadMore" :filter-method="selectFilter"
  2. @visible-change="selectVisible" placeholder="请选择" :popper-append-to-body="false">
  3. <el-option v-for="item in options_.slice(0, range)" :key="item.value" :label="item.label" :value="item.value">
  4. </el-option>
  5. </el-select>

js代码:

  1. <script>
  2. export default {
  3. name: "AboutView",
  4. data () {
  5. return {
  6. options: [],//总下拉数据
  7. options_: [],//过渡下拉数据
  8. range: 100,//初始渲染条数基数
  9. filterTime: null,//自定义查询功能的节流定时器
  10. form: {
  11. value: ""
  12. }
  13. }
  14. },
  15. directives: {
  16. 'el-select-loadmore': {
  17. bind (el, binding) {
  18. // 获取element-ui定义好的scroll盒子 监听滚动条加载数据
  19. const SELECTWRAP_DOM = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap');
  20. SELECTWRAP_DOM.addEventListener('scroll', function () {
  21. const condition = SELECTWRAP_DOM.scrollHeight - SELECTWRAP_DOM.scrollTop - SELECTWRAP_DOM.clientHeight;
  22. if (condition <= 10) {
  23. binding.value()
  24. }
  25. });
  26. }
  27. }
  28. },
  29. methods: {
  30. getList () {
  31. for (let i = 0; i < 100000; i++) {
  32. this.options.push({
  33. label: "数据" + i,
  34. value: "数据" + i
  35. })
  36. }
  37. },
  38. loadMore () {
  39. //传入指令的增加渲染条数方法
  40. this.range += 50;
  41. },
  42. selectFilter (val) {
  43. // 自定义下拉查询方法 做了节流
  44. if (this.filterTime) {
  45. clearTimeout(this.filterTime);
  46. this.filterTime = null;
  47. }
  48. this.filterTime = setTimeout(() => {
  49. if (val) {
  50. let filterArr = this.options.filter(item => {
  51. return item.label.toLowerCase().includes(val.toLowerCase());
  52. });
  53. this.options_ = filterArr;
  54. } else {
  55. this.options_ = this.options
  56. }
  57. }, 500);
  58. },
  59. selectVisible (v) {
  60. //下拉框显隐监听事件 控制渲染初始数据以及恢复总数据
  61. this.range = 100;
  62. if (!v) this.options_ = this.options;
  63. },
  64. },
  65. created () {
  66. this.getList();
  67. }
  68. }
  69. </script>

效果图:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/114841
推荐阅读
相关标签
  

闽ICP备14008679号