首页 > 其他分享 >element-ui tree 异步树实现勾选自动展开、指定展开、指定勾选

element-ui tree 异步树实现勾选自动展开、指定展开、指定勾选

时间:2023-11-15 09:57:27浏览次数:52  
标签:node nodeDataIds 结点 tree 指定 勾选 let 展开

element-ui tree 异步树实现勾选自动展开、指定展开、指定勾选

 

背景

项目中用到了vue的element-ui框架,用到了el-tree组件。由于数据量很大,使用了数据懒加载模式,即异步树。异步树采用复选框进行结点选择的时候,没法自动展开,官方文档找了半天也没有找到好的办法! 找不到相关的配置,或者方法可以使用。 经过调试与阅读elment-ui源码才发现有现成的方法可以进行结点展开。下面就介绍结点展开的实现!

1.监听复选框点击事件check

复制代码
<el-tree
        :props="mulprops"
        :load="loadNode"
        lazy
        node-key="id"
        show-checkbox
        accordion
        @current-change="currentChange"
        :filter-node-method="filterNode"
        @check="handleCheck"
        ref="tree"
        :default-checked-keys="defaultCheckedNodes"
        :default-expanded-keys="defaultExpandedNodes"
    >
    </el-tree>
复制代码

2.手动展开,使用node.expand()方法

复制代码
handleCheck(nodeData,  treeChecked) {
      let node = this.$refs.tree.getNode(nodeData.id)
      //将选中的未展开的节点进行展开
      if(node.checked && !node.expanded){
        node.expand(function(){
          for(let i=0; i< node.childNodes.length; i++){
            node.childNodes[i].expand()
          }
        })
      }
    }
复制代码

 

项目中的实现

一、复选框勾选后能自动展开并选中,先展开再勾选也可以自动展开

1.监听check-change事件

复制代码
    <el-tree
        :props="mulprops"
        :load="loadNode"
        lazy
        node-key="id"
        show-checkbox
        accordion
        @check-change="handleCheckChange"
        :filter-node-method="filterNode"
        ref="tree"
        :default-checked-keys="defaultCheckedNodes"
        :default-expanded-keys="defaultExpandedNodes"
    >
    </el-tree>
复制代码

2.编写展开勾选结点方法

复制代码
handleCheckChange(nodeData, nodeSelected) {
      let tree = this.$refs.tree;
      let node = tree.getNode(nodeData.id)

      //展开选中的未展开的节点
      this.expandCheckedNotExpandNodes(node);

      //具体业务实现
      console.log(nodeData, nodeSelected)
    },
    //展开选中的未展开的节点
    expandCheckedNotExpandNodes(node) {
      let tree = this.$refs.tree;
      if (node.checked && !node.expanded && !node.isLeaf) {
        node.expand(function () {
          let childNodes = node.childNodes;
          for (let i = 0; i < childNodes.length; i++) {
            let childNode = childNodes[i];
            //手动触发check-change事件,事件处理函数中回继续调用此函数,形成递归展开
            tree.$emit('check-change', childNode.data, childNode.checked, childNode.indeterminate);
          }
        })
      }
    },
复制代码

二、 展开指定结点

   <el-input type="text" v-model='nodeDataIds' placeholder="请输入结点数据ID(多个以逗号分割)"> ></el-input>
    <el-button type="primary" @click="expandNodes(nodeDataIds.split(','))">展开指定结点</el-button>
   

 

复制代码
//展开匹配的结点,根结点默认展开
    expandNodes(nodeDataIds){
        let that = this;
        let tree = this.$refs.tree;
        let rootNode = tree.root;
        this.expandNode(rootNode, nodeDataIds);
    },
    //展开指定结点下匹配的结点
    expandNode(node, nodeDataIds){
        let that = this;
        //当前结点需要展开未展开,则展开(根结点默认展开)
        if(node.level==0 || nodeDataIds.indexOf(node.data.id) != -1){
           //展开孩子结点
           let expandChildren = function(){
               let childNodes = node.childNodes;
               for (let i = 0; i < childNodes.length; i++) {
                  let childNode = childNodes[i];
                  //递归展开孩子结点
                  that.expandNode(childNode, nodeDataIds);
               }
           }
           if(!node.expanded){
               //当前结点未展开则先展开,展开后再展开孩子结点
               node.expand(function(){
                    expandChildren();
               });
           }else{
                //当前结点已展开,直接展开孩子结点
                expandChildren();
           }
        }
    },
复制代码

 

 

三. 勾选指定结点

1.异步树,需先展开指定结点,然后有数据了才能勾选上(即:展开父结点,子节点有了数据才能勾选上)

  <el-button type="primary" @click="checkNodes(nodeDataIds.split(','))">选中指定结点</el-button>
    

expandNodes(nodeDataIds)
展开完成的时机比较难判断
 checkNodes(nodeDataIds){
         let tree = this.$refs.tree;
         tree.setCheckedKeys(nodeDataIds, false)
    }

 2.设置默认勾选的结点,再调用展开方法会自动勾选上,适合写数据回显

default-checked-keys=['node001','node002']
expandNodes(nodeDataIds)

 

四、展开并勾选结点(支持异步树)牛逼版,实现展开回调

复制代码
//展开匹配的结点,根结点默认展开
    expandNodes(nodeDataIds){
        let that = this;
        let tree = this.$refs.tree;
        let rootNode = tree.root;
        this.expandNode(rootNode, nodeDataIds, function(){
            that.checkNodes(['node001','node002']);
        });
    },
    //展开指定结点下匹配的结点
    expandNode(node, nodeDataIds, callback){
        let that = this;
        //递归进入
        that.recursiveEnter();

        //当前结点需要展开未展开,则展开(根结点默认展开)
        if(node.level==0 || nodeDataIds.indexOf(node.data.id) != -1){
           //展开孩子结点
           let expandChildren = function(){
               let childNodes = node.childNodes;
               if(childNodes.length > 0){
                   for (let i = 0; i < childNodes.length; i++) {
                      let childNode = childNodes[i];
                      //递归展开孩子结点
                      that.expandNode(childNode, nodeDataIds, callback);
                   }
               }
           }
           if(!node.expanded){
               //当前结点未展开则先展开,展开后再展开孩子结点
               node.expand(function(){
                    //展开孩子结点
                    expandChildren();

                    //递归退出
                    that.recursiveExit(callback);
               });
           }else{
                //当前结点已展开,直接展开孩子结点
                expandChildren();

                //递归退出
                that.recursiveExit(callback);
           }
        }else{
            //递归退出
            that.recursiveExit(callback);
        }
    },
    //递归计入计数剩余递归次数
    recursiveEnter(){
        this.recursiveRemainCount++;
        console.log('enter recursiveRemainCount', this.recursiveRemainCount)
    },
    //递归退出计数剩余递归次数
    recursiveExit(callback){
       this.recursiveRemainCount--;
       console.log('exit recursiveRemainCount', this.recursiveRemainCount)
       if(this.recursiveRemainCount==0){
         if(callback){
            callback();
         }
       }
    },
    checkNodes(nodeDataIds){
         let tree = this.$refs.tree;
         tree.setCheckedKeys(nodeDataIds, false)
    }

原文 地址 https://www.cnblogs.com/hdwang/archive/2022/08/11/16578072.html
复制代码

 

标签:node,nodeDataIds,结点,tree,指定,勾选,let,展开
From: https://www.cnblogs.com/yangwangxingkongboy/p/17833186.html

相关文章

  • 视频推拉流EasyDSS直播点播平台获取指定时间快照的实现方法
    视频推拉流直播点播系统EasyDSS平台,可提供流畅的视频直播、点播、视频推拉流、转码、管理、分发、录像、检索、时移回看等功能,可兼容多操作系统,在直播点播领域具有广泛的场景应用。为了便于用户集成、调用与二次开发。今天我们来介绍下在EasyDSS中,获取指定时间快照的实现方法。在Ea......
  • 拉取远程仓库指定分支的代码
    1#查看本地所有分支2gitbranch34#查看本地和远程仓库的所有分支5gitbranch-a67#查看远程仓库的分支8gitbranch-r91011#拉取远程仓库的代码:12#把远程分支拉到本地131、gitfetchorigindev(dev为远程仓库的分支名)14#在本地创建分支dev......
  • [链表] 2-链表内指定区间反转
    ----------......
  • 暴露后端指定文件夹资源
    以项目中的media文件夹为例:在urls文件中书写以下代码:首先需要导入模块:fromdjango.views.staticimportserve 再导入项目的配置文件:from项目名importsettings setting文件中配置:#配置用户上传的文件存储位置MEDIA_ROOT=os.path.join(BASE_DIR,'media')......
  • dotnet 发布程序,并指定端口和配置文件运行
    发布命令发布时,进入到Host文件夹路径下dotnetpublish-cXXX发布完成会生成一个XXX文件夹,里面\net6.0\publish就是发布的程序了运行命令运行时,进入到publish文件夹,并在此处打开终端设置运行端口为8888,使用配置文件appSettings.XXX.jsondotnet[Host].dll--urls"http......
  • es指定返回的字段
    2.7.6指定返回的字段GET/lib3/user/_search{"_source":["address","name"],"query":{"match":{"interests":"changge"}}}2.7.7控制加载的字段GET/lib3/user/_search{"query":{"ma......
  • PDF统一大小缩放至A4或指定大小
    PDF统一大小缩放至A4或指定大小https://jingyan.baidu.com/article/ed15cb1bb9b95d1be2698163.html如何让pdf中的所有图片宽度一致,高度自适应?去除空白边https://www.zhihu.com/question/449570733?utm_id=0......
  • java怎么实现对指定进行多线程访问的效果
    要使用Java实现对特定网站(例如"http://xkrj5.com")的多线程访问,你可以采用以下步骤:创建一个线程类:这个类将负责执行HTTP请求。使用线程池:这可以更有效地管理多个线程。执行HTTP请求:使用Java的网络库(如 HttpURLConnection 或第三方库如ApacheHttpClient)。下面是......
  • js帮我实现单页面跳转到指定页面的技术!
    网站的根目录下的HTML文件中(通常是 index.html 或 index.php)使用 window.location 对象。以下是一个简单的HTML页面示例,它包含了JavaScript代码,用于执行这样的重定向:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compa......
  • 递归获取指定目录下的指定类型的文件
     1:递归获取指定目录下的指定类型的文件     public class FileTool    {        /// <summary>        ///  私有变量        ///  </summary>        private static List<FileInfo> lst = new List<FileInfo......