如何处理el-tree 搜索卡顿问题

如何处理el-tree 搜索卡顿问题


前言

最近在做el-tree的搜索功能,根据element UI 提供的fliter方法可以完成,可是当数据量过大时就会卡顿,最终发现条件判断和延时和v-if 结合效果不错


提示:以下是本篇文章正文内容,下面案例可供参考

一、具体操作

1.template部分

代码如下(示例):


    <el-form-item style="margin-bottom:7px">
            <el-input
              v-model="filterText" //搜索栏绑定的值,会在watch中监听
              clearable
              maxlength='50'
              placeholder="请输入内容">
              <i slot="prefix" class="el-input__icon el-icon-search"></i>
            </el-input>
          </el-form-item>
  <el-form-item
            v-loading="filterLoading" // 可以搜索的时候出现等待的效果
            :style="{'height':tableHeight-260 -30 +'px','border':'solid 1px rgb(242, 242, 242)','overflow':'auto'}"
            element-loading-spinner="el-icon-loading"
            element-loading-text="加载数据中"
          >
            <el-tree
              v-if='treeShow' // 当输入框输入内容的时候该部分不渲染,减少不断查询的次数
              ref="tree"
              :data="treeData"
              :default-expanded-keys="treeExpandData"
              :filter-node-method="filterNode" //element 提供的方法
              :props="treeDefaultProps"
              accordion
              check-on-click-node
              check-strictly
              highlight-current
              node-key="id"
              show-checkbox
              @check="checkGroupNode"
            ></el-tree>
          </el-form-item>

2.watch

这里我做了一个搜素内容是否是中文的判断,根据自己的实际情况做增减

//声明的一个延时器,在watch中调用
const debounce = (function () {
  let timer = 0
  return function (func, delay) {
    clearTimeout(timer)
    timer = setTimeout(func, delay)
  }
})()

/*-----------------*/
 watch: {
    filterText(val) {
      if (/.*[\u4e00-\u9fa5]+.*$/.test(val)) { //判断是否是中文
        this.treeShow = false
        this.filterLoading = true
        debounce(() => { //延时器
          this.$refs.tree.filter(val.trim()) //el-tree 自身的筛查方法
          this.filterLoading = false
        }, 100);
        this.treeShow = true
      } else {
        return
      }
    }
  },

2.methods

   filterNode(value, data, node) { 
      if (!value) return true
      let parentNode = node.parent,
        labels = [node.label],
        level = 1
      while (level < node.level) {
        labels = [...labels, parentNode.label]
        parentNode = parentNode.parent
        level++
      }
      return labels.some(label=> label.indexOf(value) !== -1)
    },

总结

希望对你有帮助,新手一枚,欢迎指正,希望给已经秃头的我一个赞👍,鼓励底层的搬砖人

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
el-tree顿崩溃的原因是因为在渲染时直接将大量节点渲染到页面上,导致页面性能下降。解决这个问题的方法是使用虚拟滚动列表插件与el-tree结合。 首先,你可以参考网上使用virtual-scroll-list插件与el-tree源码写成一个新组件的方法。virtual-scroll-list插件可以只渲染页面呈现部分的节点,从而避免顿和崩溃的问题。你可以通过下载该组件的GitHub或Gitee链接来获取组件代码。 接下来,你可以按照el-tree的使用方法来使用这个新的组件。你可以根据自己的业务需求进行适当的更改。注意,这个新组件只是实现了文件导出的需求。 下面是一个使用示例: ```html <virtualNodeTree ref="dirTree" :data.sync="treeData" :load="loadDir" :keeps="50" :check-strictly="false" :props="{ isLeaf: 'leaf' }" lazy show-checkbox node-key="path" class="treeWrap" @check-change="handleCheckChange"> <span slot-scope="{ data }"> <svg-icon v-if="data.ftype === '1'" style="color: #fdd300;" icon-class="faFolder"/> <span v-else> <svg-icon :icon-class="fileInputHandle(data).icon" :style="{color: fileInputHandle(data).color}"/> </span> <span>{{ data.fname }}</span> </span> </virtualNodeTree> ``` 另外,还有一种解决el-tree顿崩溃的方法是给tree设置一个height属性,使其切换为虚拟滚动,从而提升长列表的性能表现。但需要注意的是,设置了这个属性后,可能会导致无法使用懒加载和拖拽功能。 如果你想要更多功能或者与el-tree结合使用,还可以尝试使用ElementUI的el-select与el-tree结合。 希望这些解决方法能帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值