关于el-tree的碎碎念 懒加载子树

在开发中经常会用到树形结构,数据是后端返回的,其余的操作都在前端完成,在此记录一些操作
最基础的用法,官方案例

<el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree>

<script>
  export default {
    data() {
      return {
        data: [{
          label: '一级 1',
          children: [{
            label: '二级 1-1',
            children: [{
              label: '三级 1-1-1'
            }]
          }]
        }, {
          label: '一级 2',
          children: [{
            label: '二级 2-1',
            children: [{
              label: '三级 2-1-1'
            }]
          }, {
            label: '二级 2-2',
            children: [{
              label: '三级 2-2-1'
            }]
          }]
        }, {
          label: '一级 3',
          children: [{
            label: '二级 3-1',
            children: [{
              label: '三级 3-1-1'
            }]
          }, {
            label: '二级 3-2',
            children: [{
              label: '三级 3-2-1'
            }]
          }]
        }],
        defaultProps: {
          children: 'children',
          label: 'label'
        }
      };
    },
    methods: {
      handleNodeClick(data) {
        console.log(data);
      }
    }
  };
</script>

在这里插入图片描述
项目中需要做懒加载子树,每展开一次去加载当前节点的children
在这里插入图片描述
我用到的属性和方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
node-key我绑定的是,每个节点的唯一标识themeId
在这里插入图片描述
给el-tree加上ref,方便后续操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据自己的需要修改没有数据时展示的文本,默认为:暂无数据
在这里插入图片描述
修改后,当数据没有加载出来时,会显示自己设置的文字
在这里插入图片描述

在这里插入图片描述
我的基本配置就是这些了

      <div class="tree-container">
        <el-tree
          lazy
          show-checkbox
          node-key="themeId"
          :load="loadNode"
          ref="themeTree"
          :data="themeTreeData"
          :props="defaultProps"
          empty-text="别急,正在加载数据"
          :check-strictly="true"
        >
        </el-tree>
      </div>

接下来到要处理逻辑的部分了,点击每个节点的展开按钮去加载子树,如果有子树数据,就继续展开,如果没有子树就显示复选框
在这里插入图片描述
加载子树的方法

    loadNode(node, resolve) {
      if (node.level === 0) {
        //获取数据
        this.getTree(resolve);
      }
      if (node.level >= 1) {
        //加载子树
        this.getChildTree(node, resolve);
      }
    },

我的tree是在弹窗里面的,当我显示弹窗的时候,渲染tree的时候就会去自己调用一次loadNode这个方法,刚开始没有数据,我们看一下他传过来的初始参数node是什么样的
在这里插入图片描述
没有数据时node的level是0,后面的每一层的level都是递增的(第一层的node的level是1,第二层是2…)
所以才有了我们的逻辑(调用方法时将resolve传递过去,用于返回数据)

 loadNode(node, resolve) {
      if (node.level === 0) {
        //获取数据
        this.getTree(resolve);
      }
      if (node.level >= 1) {
        //加载子树
        this.getChildTree(node, resolve);
      }
    },

getTree 第一次加载数据 将获取到的数据放到resolve里返回

    getTree(resolve) {
      let param = {
        themeId: "753738c7-fa3d-11e6-b2a4-d4ae5278",
        themeType: "THEME",
      };
      getThemeTree(param).then((response) => {
        if (response.succ === "ok") {
          let data = response.result;
          resolve(data);
        }
      });
    },

getChildTree 每次点击展开图标去加载子数据 将获取到的数据放到resolve里返回

    getChildTree(node, resolve) {
      let param = {
        themeId: node.data.themeId,
        themeType: "THEME",
      };
      getThemeTree(param).then((response) => {
        if (response.succ === "ok") {
          let data = response.result;
          resolve(data);
        }
      });
    },

对于样式的处理 如果某个节点是叶子节点(展开后没有子节点了)那么显示复选框可以选中,其余都不显示复选框(只有展开图标) 穿透样式可以是 /deep/ >>> ::v-deep

::v-deep .el-tree-node {
  .el-checkbox {
    display: none;
    .el-checkbox__inner {
      display: none;
    }
  }

  .is-leaf + .el-checkbox {
    display: inline-block;
    .el-checkbox__inner {
      display: inline-block;
    }
  }
}

在这里插入图片描述
如果不修改样式,因为设置了show-checkbox,每一个节点都会有复选框
在这里插入图片描述
以上就是关于我这次项目中用懒加载子树的所有逻辑了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现 el-tree懒加载功能,你可以按照以下步骤进行操作: 1. 配置数据源:首先,你需要配置一个异步数据源,用于提供懒加载的数据。这可以是一个后端接口,返回符合 el-tree 要求的节点数据。 2. 设置懒加载属性:在 el-tree 组件中,设置 `lazy` 属性为 `true`,开启懒加载功能。 3. 实现加载方法:创建一个方法,用于根据节点的信息从数据源中获取子节点数据。可以使用 `load` 属性来指定这个方法。这个方法应该接收一个参数,代表当前节点的数据对象,并返回一个 Promise 对象来异步获取子节点数据。 4. 更新节点数据:在加载方法中,通过调用 `resolve` 方法将获取到的子节点数据传递给它,以更新节点的子节点。 这是一个简单的示例代码,演示了如何实现 el-tree懒加载: ```vue <template> <el-tree :data="treeData" :load="loadTreeData" :lazy="true"></el-tree> </template> <script> export default { data() { return { treeData: [] // 初始化树数据为空 } }, methods: { loadTreeData(node, resolve) { // 调用异步接口获取子节点数据 axios.get('/api/getChildren', { params: { nodeId: node.id } }) .then(response => { const children = response.data.children; // 更新节点的子节点数据 resolve(children); }) .catch(error => { console.error('Failed to load tree data:', error); }); } } } </script> ``` 在上述示例中,`loadTreeData` 方法使用 axios 发起异步请求,根据当前节点的 id 获取子节点数据,并将数据通过 `resolve` 方法传递给 el-tree 组件,以更新节点的子节点。 你可以根据自己的实际情况,调整数据源和加载方法的实现。希望这个示例能帮助你实现 el-tree懒加载功能!如有更多问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值