el-tree树形节点过滤

17 篇文章 0 订阅
4 篇文章 0 订阅

需求:

1.获取到节点数据的情况下勾选节点,勾选的结果展示在右侧列表,点击左侧X可删除勾选,鼠标放上结果列时展示节点路径和id,比如:“父节点>子节点”;

2.节点上方输入框可模糊搜索节点名称和id,要求:1、搜索到父目录时子节点不要过滤,父目录不打开。2、搜索到子目录时,父目录默认打开

原型如下:

 1.首先,要实现显示节点路径,使用递归为每个节点拼接路径,子节点的路径为:父路径+子节点名称,一直往下层级相加。

let datas = res.data.data;
datas.forEach(value => {
   value.tagId = value.id;
   value.tagName = value.name;  
   value.tagIdPath = value.name;
   value = this.setData(value,value.id);
   if (value.isChoose) {//回显保存的频道,isChoose旧字段,后端已废弃,不用管
      this.checked.push(value.id);
      this.selectList.push(value);
    }
    if(this.activeLabel.length>0){//补充路径,用于回显
      this.activeLabel.forEach(item=>{
         if(value.tagId==item.tagId){
             item.tagIdPath = value.tagIdPath
             }
           }) 
       }
    });
this.data = datas;

递归:

setData(data){
  if(data.child && data.child.length>0){
    data.child.forEach(item=>{
      item.tagId = item.id;
      item.tagName = item.name;  
      item.tagIdPath = data.tagIdPath+'>'+item.tagName;
      item = this.setData(item);
     })
     return data;
    }else{
      return data;
    }
  },

效果如下:

2.要实现需求中的过滤效果,首先 根据查询节点Node存在属性expanded为true表示打开节点,false表示关闭节点,that.$refs.tree.filter(that.filterText);手动触发tree的过滤方法,在methods中写filterNode函数,会依次过滤tree中的每个节点,类似于数组中的filter。nodeExpend保存过滤到的节点信息id,data.tagIdPath.indexOf(value)!=-1表示过滤到父节点时子节点不用被过滤

filterNode(value, data) {//依次过滤每个不符合的数据
          // console.log('value',value);
          //console.log('data',data);
            if(value && (data.name.indexOf(value) !== -1 || (data.id+'').indexOf(value)!=-1)){
               this.nodeExpend.push(data.id);//去除重复
            }
            if (!value) return true;
            return data.name.indexOf(value) !== -1 || (data.id+'').indexOf(value)!=-1 || data.tagIdPath.indexOf(value)!=-1;//名称或者id模糊搜索
        },

3.输入框输入时监听filterTextInput防抖触发过滤事件,然后判断过滤到哪个位置,是到了父节点还是到了子节点,到了父节点父节点默认不展开,父节点的父节点展开。this.$refs.tree.store.nodesMap获取所有节点信息

filterTextInput() {//防抖
        let that = this;
        that.treeLoading = true;
        this.nodeExpend = [];
        if(this.timeout){
          clearTimeout(this.timeout);
          this.timeout = setTimeout(() => {
            //that.treeLoading = true;
            that.$refs.tree.filter(that.filterText);
            that.treeLoading = false;
            var nodes = this.$refs.tree.store.nodesMap;
            //console.log('nodeExpend',this.nodeExpend);
            let parentNodeList = [];
            for (var i in nodes) {
              nodes[i].expanded = false;
              if(this.nodeExpend.indexOf(nodes[i].data.id)!=-1){
                //console.log('node[i]',nodes[i]);
                parentNodeList.push(nodes[i]);
              }
            }
            parentNodeList.forEach(item=>{
              console.log(item.data.name);
              //item.expanded = true;
              this.setExpanded(item);
            })
          }, 1000);
        }else{
          this.timeout = setTimeout(() => {
            //that.treeLoading = true;
            that.$refs.tree.filter(that.filterText);
            that.treeLoading = false;
            var nodes = this.$refs.tree.store.nodesMap;
            //console.log('nodeExpend',this.nodeExpend);
            let parentNodeList = [];
            for (var i in nodes) {
              nodes[i].expanded = false;
              if(this.nodeExpend.indexOf(nodes[i].data.id)!=-1){
                //console.log('node[i]',nodes[i]);
                parentNodeList.push(nodes[i]);
               
              }
            }
            parentNodeList.forEach(item=>{
              console.log(item.data.name);
              //item.expanded = true;
              this.setExpanded(item);
            })
          }, 1000);
        }
      },
      setExpanded(data){
        if(data.parent){
          //console.log('parent',data.parent.data.name);
          data.parent.expanded = true;
          this.setExpanded(data.parent);
        }else{
          return;
        }
      },

结果:

1.查询到父节点,父节点默认不展开,子节点不过滤掉

2.查询到子节点,父节点默认展开

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值