el-tree树组件懒加载-后端上千条数据前端进行处理

实现懒加载tree,需要为tree组件添加lazy:load="load"
首先,load属性绑定一个懒加载函数,当点击节点时触发

一般是通过树节点id请求后端接口,添加新的节点数据,但我最近遇到的是后端一次性返回上千条数据(树数组结构),由前端进行处理实现懒加载

我们来看下怎么实现

  <el-tree
      ref="tree"
      lazy
      :load="load"
      highlight-current
      @node-click="handleNodeClick"
      :expand-on-click-node="false"
      :node-key="key"
      :props="defaultProps"
      :current-node-key="currentNodeKey"
    >
   </el-tree>
  1. load方法会回调两个参数,第一个是节点信息node,第二个是加载函数resolve
  2. resolve会默认触发一次,并且node.level===0,所以就不用在created中请求后端数据了,直接在默认触发中请求后端数据
  3. 如果node.level===0说明是默认触发,直接resolve请求后端返回的树数组数据,el-tree懒加载情况下只会渲染数组的第一级,不会渲染数组的children
  4. 在默认触发的时候将树数组转成扁平数组,后续懒加载节点的时候从扁平数组里取就可以了
  5. 因为懒加载树无法判断有没有子节点,所以必须手动添加leaf:true,才能取消左侧的小箭头,在树结构数组转换成扁平数组时给没有子节点的数组对象加上这一属性
  6. 很多时候需要默认展开树节点,比如选中第一级下第一个节点,在nextTick中nodedata.expanded = true来展开节点,nodedata.loadData()再次触发resolve函数
  methods: {
    /** 传递一个懒加载函数给el-tree组件 */
    load(node, resolve) {
      this.chooseNode = node;
      // 这里后端给的数据唯一标识不是id,是key,根据个人数据修改
      this.getTreeData(node.level, node.data.key, resolve);
    },
    /** 懒加载树节点数据处理函数 */
    async getTreeData(level, key, resolve) {
      if (level === 0) {
        this.loading = true;
        const { data: res } = await http.post('getTreeNode');
        if (res.code === 200 && res.data && res.data.length) {
          this.treeData = this.treeArrayToArray(res.data);
          resolve(res.data);
          this.$nextTick(() => {
            // 零级的第一个子节点,也就是第一级的第一个节点
            let nodedata = this.chooseNode.childNodes[0];
            nodedata.expanded = true;
            // 再次触发load方法
            nodedata.loadData();
            // 注意,因为上方再次触发load方法,走了this.chooseNode = node;这一步,所以这里的 this.chooseNode指向的是零级的子节点,也就是第一级,这里的`this.chooseNode.childNodes[0]`表示的是是第二级的第一个节点
            this.currentNodeKey = this.chooseNode.childNodes[0].data.key;
            this.handleNodeClick(this.chooseNode.childNodes[0].data);
          });
        } else {
          resolve([]);
        }
        this.loading = false;
      } else {
        // 根据key去找到点击树节点的children数组,加载数据到其下
        const currentNode = this.treeData.find(item => item.key === key);
        if (currentNode.children && currentNode.children.length) {
          resolve(currentNode.children);
        } else {
          resolve([]);
        }
      }
    },
    /** 树结构数组转换成扁平数组 */
    treeArrayToArray(tree) {
      const arr = [];
      function recursiveFunction(tree) {
        for (let i = 0; i < tree.length; i++) {
          // 给所有没有子节点的节点添加leaf属性,该属性用来取消左侧小箭头
          if (!(tree[i].children && tree[i].children.length)) {
            tree[i].leaf = true;
          }
          arr.push(tree[i]);
          if (tree[i].children && tree[i].children.length) {
            recursiveFunction(tree[i].children);
          }
        }
      }
      recursiveFunction(tree);
      return arr;
    },
    /** 获取点击树节点的数据,进行渲染右侧页面等操作 */
    handleNodeClick(data) {
    },
  },
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ElTree 是 Element UI 中的一个组件,它支持动态数据,也就是。通过设置 `lazy` 属性为 `true`,可以实现动态子节点的功能。 要实现动态数据,需要使用 `load` 事件来自定义子节点的方式。当某个节点展开时,ElTree 会触发 `load` 事件,并将该节点的数据对象作为参数传递给事件处理函数。在事件处理函数中,我们可以根据该节点的数据对象来动态子节点的数据。 下面是一个简单的示例代码,演示了如何使用 ElTree 实现动态数据: ```html <template> <el-tree :data="treeData" :lazy="true" :load="loadChildren" ></el-tree> </template> <script> export default { data() { return { treeData: [ { label: '节点1', loading: false, children: [] }, { label: '节点2', loading: false, children: [] } ] }; }, methods: { loadChildren(node, resolve) { // 模拟异步子节点数据 node.loading = true; setTimeout(() => { // 获取子节点数据 const childrenData = [ { label: '子节点1' }, { label: '子节点2' } ]; // 更新节点的子节点数据 node.children = childrenData; node.loading = false; // 解析子节点数据,告诉 ElTree 数据完成 resolve(childrenData); }, 1000); } } }; </script> ``` 在上述代码中,`loadChildren` 方法用于子节点数据。在该方法内部,我们可以执行异步操作来获取子节点数据,然后将数据赋值给节点的 `children` 属性,并调用 `resolve` 函数来告知 ElTree 数据完成。 这样,当用户展开某个节点时,会触发 `load` 事件,然后调用 `loadChildren` 方法来子节点数据并显示在组件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值