el-tree结合搜索框动态控制tree懒加载(后台搜索)

11 篇文章 0 订阅
本文介绍了如何在Vue.js中使用Element UI的el-tree组件实现懒加载功能,以及在搜索操作时如何优化数据加载和默认展开节点。关键点包括:控制lazy属性、设置node-key和default-expanded-keys,以及在搜索时清除数据和重新加载。通过调整el-tree的lazy属性和正确处理搜索事件,可以避免不必要的请求,提高用户体验。
摘要由CSDN通过智能技术生成

实现关键点:

        this.$refs.tree.$data.store.lazy 控制lazy属性是否是生效的,取值为Boolean;

        node-key="id" 用于展开搜索出的节点

        default-expanded-keys="expandArr" 默认展开节点的数组

代码:

HTML

<el-tree
   ref="tree"
   :data="treeData"
   :load="loadNode"
   :props="defaultProps"
   lazy
   node-key="id"
   :default-expanded-keys="expandArr"
   @node-click="handleNodeClick"
></el-tree>

异步加载树节点代码

// 懒加载节点
loadNode(node, resolve) {
   // 一级节点处理
   if (node.level == 0) {
      this.getTreeData(resolve, "", true);
      this.resolve = resolve;
   }
   // 其余节点处理
   if (node.level >= 1) {
      this.getTreeData(resolve, node.data.code, false);
   }
},

input框搜索事件

searchActionTree() {
   if (!this.searchData.orgName) {
     console.log("searchActionTree");
     this.treeData = [];
     this.expandArr = [];
   }
   this.getTreeData(this.resolve, "", false);
},

获取数据

    async getTreeData(resolve, parentCode, lazeFlag) {
      if (!lazeFlag) {
        this.$refs.tree.$data.store.lazy = !this.searchData.orgName;
      }
      let { code, data, message } = await this.$http.marketing_mdmOrgLazyTree({
        parentCode,
        name: this.searchData.orgName,
      });
      if (code) {
        data.forEach(element => {
          element.leaf = false;
        });
        this.expandArr = [];
        if (!this.searchData.orgName) {
          resolve(data);
        } else {
          this.treeData = [];
          this.treeData = JSON.parse(JSON.stringify(data));
          this.pushID(data);
        }
      } else {
        this.$message.error(message);
      }
    },

    // 递归遍历获取要展开的节点数组
    pushID(Array) {
      Array.forEach(item => {
        this.expandArr.push(item.id);
        if (item.children && item.children.length > 0) {
          console.log(item);
          this.pushID(item.children);
        }
      });
    },

注意点:

        在搜索el-tree时,如果搜索条件为空,那么需要清除el-tree绑定的data数据,并且将默认展开节点置为空数组;

        在获取的数据的方法中首先要根据条件控制el-tree是否要进行懒加载,一般搜索时结合了默认展开节点,所以必须设置非懒加载,否则展开的节点都将调用一次获取数据的方法,导致请求数量庞大,影响用户体验,并且有极大的资源浪费

        在获取数据的方法中,根据是否是进行搜索判断获取到的数据是resolve出去还是赋值给el-tree的data变量。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
实现 el-tree懒加载搜索,可以通过监听输入框的值来控制懒加载。具体实现步骤如下: 1. 首先,在 el-tree 标签上添加一个 ref 属性,用于获取 el-tree 的实例,例如 ref="tree" 。 2. 在 data 中定义一个 filterText 变量,用于保存输入框的值。 3. 在 watch 中监听 filterText 变量的变化,当有值时,关闭懒加载并调用后端搜索的方法;当没有值时,开启懒加载并重新加载数据 。 4. 在 el-tree 标签上添加 lazy 属性并设置为 true,表示开启懒加载 。 5. 在 el-tree 标签上添加 load 属性,并绑定一个 loadNode 方法,用于在树节点展开时加载数据 。 以下是代码示例: ``` <template> <div> <input type="text" v-model="filterText" placeholder="输入搜索关键字" /> <el-tree :data="orgList" ref="tree" show-checkbox :props="defaultProps" node-key="id" @node-click="handleNodeClick" @check-change="handleClick" :default-expanded-keys="expandArr" lazy :load="loadNode" > <span class="custom-tree-node" slot-scope="{ node, data }"> <span class="tree-icon"> <img v-if="data.isTop" style="width: 20px; height: 16px" src="@/assets/img/repositoryImg/tree.png" alt />  {{ node.label }} </span> </span> </el-tree> </div> </template> <script> export default { data() { return { filterText: '', // 保存输入框的值 orgList: [], // 树形数据 defaultProps: { children: 'children', label: 'label' } }; }, watch: { filterText(val) { if (val) { this.$refs.tree.$data.store.lazy = false; // 当输入框有值时关闭懒加载 this.getSeachList(); // 获取后端搜索的数据 } else { this.$refs.tree.$data.store.lazy = true; // 开启懒加载 this.getOrgList(); // 加载数据 } } }, methods: { // 加载树节点方法 loadNode(node, resolve) { // 根据业务需求实现加载树节点数据的方法 }, // 获取后端搜索的数据 getSeachList() { // 根据业务需求实现后端搜索的方法 }, // 获取树形数据 getOrgList() { // 根据业务需求实现获取树形数据的方法 }, // 节点点击事件 handleNodeClick(node) { // 根据业务需求实现节点点击事件的方法 }, // 复选框点击事件 handleClick() { // 根据业务需求实现复选框点击事件的方法 } } }; </script> ``` 以上就是实现 el-tree 懒加载搜索的方法。根据输入框的值来控制懒加载开关,并实现后端搜索的数据获取。同时使用 lazy 属性和 load 方法实现 el-tree懒加载功能。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值