el-tree动态加载子级( 结合checkbox)

本文介绍在使用el-tree组件时,如何实现在勾选父级复选框时加载并渲染子级数据的需求。通过分析ElementUI源码,提供了一种解决方案,包括自定义方法getChildren获取子节点数据,及利用node.loadData()手动触发加载。

需求是el-tree 的子级 需要在:

  1. 展开父级时
  2. 勾选父级复选框时

加载子级数据并渲染dom结构。

需求1 还是比较好做的,官方有实例说明;
需求2 的话,翻了下element ui的源码,
checkBox上直接加了@click.native.stop T^T
也就是说点击checkBox的时候根本不会触发loadNode 这个方法
没办法只能去找手动触发的方法了,翻了一遍果然有!!!
node.loadData() 就是这个,具体的看下面代码吧:

<template>
	<el-tree
	  :data="dataList"
	  show-checkbox
	  node-key="code"
	  ref="treeId"
	  @check="getKeys"
	  :expand-on-click-node="true"
	  :load="loadNode"
	  :lazy="lazy"
	>
	</el-tree>
</template>
<script>
export default {
  props: {
  	//	el-tree 的最外层(第一级)数据传入
    dataList: {
      type: Array,
      default: () => {
        return [];
      }
    }
  },
  methods: {
  	// 请求返回子级数据,在loadNode 方法里调用
    async getChildren(data) {
   		...获取并返回子节点数据
    },
    // 下面方式是你在勾选复选框时也需要加载子级数据时调用,勾选时不需要加载渲染的话就忽略此方法
    async getKeys(data) {
       // 获取当前node节点
       let node = this.$refs.treeId.getNode(data.code);
       // 这个判断条件是楼主自己的需求,可根据实际情况自行调整
       if (
         node.level === 1 &&
         !node.isLeaf &&
         (!node.childNodes || !node.childNodes.length)
       ) {
         await node.loadData(); // 触发当前勾选节点的loadNode 方法
       }
       ... 勾选过后的其他操作
    },
    // 懒加载子节点数据,且如果父节点选中状态时,重新勾选节点(el-tree会因为新增了子节点,自己取消勾选)
    // !!!这里处理请求子级数据并根据返回数据渲染el-tree的dom树
    async loadNode(node, resolve) {
      let data = node.data;
      let checked = node.checked;
      if (node.level === 1 && !data.children) {
        let res = await this.getChildren();
        resolve(res || []);
        if (checked) {
          this.$refs.treeId.setChecked(data.code, true, true);
          this.getKeys(); // 如果在勾选之后有其他操作,需要再次执行一遍才有效果(踩过坑)
        }
      }
    }
  }
};
</script>

上面就是我找到的解决方案了,如果有小伙伴有更好的方法,欢迎来交流~

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 Element UI的el-tree组件是基于Vue 2.0的桌面端组件库中的一个树形控件组件,常用于实现树形结构的数据展示和操作。在开发过程中,动态加载、新增以及更新树形控件节点是比较常见的需求。 动态加载功能使得树形控件的节点数据无需一次性全部加载,而是根据用户的展开操作,动态地从后端获取数据加载到树控件中,这对于处理大量数据能有效提升性能和响应速度。在el-tree组件中,通过设置:load属性来实现动态加载。:load是一个方法,它会在节点被点击触发,接收node和resolve两个参数。通常,会依据节点的层来确定获取数据的方式。如果是顶节点(node.level等于0),则直接从后端获取顶层数据;若非顶节点,则根据父节点的ID来获取其节点数据。在代码中,loadNode方法实现了:load属性的逻辑,利用组件内的api typeList异步获取数据,并通过resolve方法将数据返回给el-tree组件,进而更新树形控件的显示。 新增节点操作是在树形控件中添加一个新节点。一般会设置一个按钮来触发新增操作,点击后弹出对话框让用户输入节点信息。这里会用到el-dialog组件来实现弹出对话框。点击新增按钮,调用addDialogShow方法,设置对话框显示,并通过操作标志位flag来区分是新增还是更新节点。在新增节点,弹出对话框供用户输入相关信息。 更新节点则是修改树形控件中已存在的某个节点的信息。更新操作通常也是通过按钮触发,弹出一个编辑对话框,并显示当前节点的信息供用户修改。在代码中,更新按钮通过slot-scope绑定点击事件,调用addDialogShow方法,此flag传入的值为1,表示执行更新操作。在更新操作中,需要将当前节点的信息保存到相应的数据
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值