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

本文介绍了如何通过条件渲染和延迟加载策略解决ElementUI的El-Tree组件在大数据量下进行搜索时的卡顿问题。作者使用`v-if`控制树的显示,并结合延时函数在搜索时避免频繁查询,从而提高用户体验。
摘要由CSDN通过智能技术生成

如何处理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)
    },

总结

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值