首页 > 其他分享 >el-tree筛选时不过滤非目标项

el-tree筛选时不过滤非目标项

时间:2023-04-25 17:55:05浏览次数:35  
标签:node el return data tree value 筛选 true 节点

  1. 效果图:

  2. 案例

    element给的api是一个遍历整个树元素的方法:

    value为搜索值,可用$refs.tree.filter(value)来传递该参数,一般配合input组件使用;

    data为该节点的内容。这里的data包括一开始构建树时的自定义参数(非children、id、label等props);

    node为节点本身,能够获取节点的一些属性,譬如是否选中,是否叶节点,第几层等。

    filter-node-method: function(value, data, node){
      if(!value) return true;
     //返回true则显示该节点,这里对应的属性时node里的visible属性
     //也就是说其实只是隐藏了其余节点,而非改变了树节点的treeData
      return data.label.indexOf(value) !== -1            
    }

    若是按照例子给的方法,则每次筛选时只会留下筛选内容(若是该字符只存在于父节点,它的子节点将不会自动展开)譬如:

  3.  解决方案

    通过打印过滤方法中的data和node参数,我们可以在data中设定自定义属性,然后在el-tree组件的props中的class属性使用回调函数同样遍历树,符合条件的更改其样式;

    而其余节点的显示则可以通过设置node.visible = true 来解决。譬如

    filterNode(value, data, node) {
          //这里设置slot为自定义属性,expanded为父节点是否展开
          //遍历先全部设为false,应对场景为首次查询后再次查询能够清除前一次查询的样式
          data.slot = false
          node.expanded = false
          if (!value) return true
          if(data.name.indexOf(value) !== -1){
            //对符合条件的节点设置额外样式
            data.slot = true
            return true
          }
          //这里因为要操作实际dom样式,因此使用nextTick,使其余节点也能显示
          this.$nextTick(()=>{
            node.visible = true
          })
        },
    //这里是绑定el-tree的props属性,即:props="defaultProps"
    defaultProps: {
            children: "children",
            label: "name",
            class: function (data, node){
              if(data.slot){
                // console.log('选中渲染',data)
                return 'is-filter'
              } return null
            }
          },
    <style>
    .is-filter{
        color: red;
      }
    </style>

    效果如下:

     可以看出这里其下的子节点也改变样式了,因为color属性能够继承下去。所以可以加上其他类名来指定到底是哪个节点需要变色

    (若是多组件页面涉及到data-v-xxxx的属性,请自行在样式中加入:deep()进行穿透,或者删掉scoped直接更改全局样式)

  4.  完整代码

    <template>
      <el-input v-model="text" @change="filterText" placeholder="Filter keyword" />
    
      <el-tree
          ref="treeRef"
          class="filter-tree"
          node-key="id"
          :data="treeData"
          :props="defaultProps"
          @node-click="handleNodeClick"
          :filter-node-method="filterNode"
      />
    </template>
    
    <script>
    export default{
      data(){
        return{
          treeData: [{
            id: 1,
            label: '一级父内容',
            children: [
              {
                id: 4,
                label: '一级子1',
                isPenultimate: true,
                children: [
                  {
                    id: 9,
                    label: '一级孙1',
                  },
                  {
                    id: 10,
                    label: '一级孙2',
                  },
                ],
              },
            ],
          },
            {
              id: 2,
              label: 'Level one 2',
              isPenultimate: true,
            },],
          text: '',
          defaultProps: {
            children: "children",
            label: "label",
            class: function(data, node){
              if(data.slot) return 'redClass'
            },
          },
        }
      },
      methods: {
        handleNodeClick(data, node){
          console.log(data)
          data.slot = true
        },
        filterNode(value, data, node){
          data.slot = false
          if(!value) return true
          if(data.label.indexOf(value) !== -1){
            console.log(data)
            data.slot = true
            return true
          }
          this.$nextTick(()=>{
            node.visible = true
          })
        },
        filterText(value) {
          this.$refs.treeRef.filter(value)
        }
      },
    }
    </script>
    
    <style>
    .el-tree-node.is-filter>.el-tree-node__content{
      color: red!important;
    }
    </style>

    这里是在element的实例页面写的,所以样式就没有加穿透了。

  5.  复选节点树

    若是设置了show-checkbox,能够复选节点的话,那么同样是这种方法。

    因为若是默认全部展示,然后再根据筛选节点的nodekey值调用方法选中(setCheckedKeys)的话,其余非过滤父节点会因return true自动展开,若是树内容过多的话会比较繁琐

     

标签:node,el,return,data,tree,value,筛选,true,节点
From: https://www.cnblogs.com/ricardox3/p/17353409.html

相关文章

  • 小技巧:如何让 Windows 应用程序在 Parallels Desktop 中启动得更快
    经过十多年的发展,ParallelsDesktop在性能方面得到了突飞猛进的提升。但俗话说,“没有最快只有更快。”因此,在这篇文章中,小编将分享您一个小技巧:如何使您的Windows应用程序启动得更快。PD最新版虚拟机永久激活版下载下图显示了视频中的同一台M1MacBookPro和在InteliM......
  • iOS MachineLearning 系列(4)—— 静态图像分析之物体识别与分类
    iOSMachineLearning系列(4)——静态图像分析之物体识别与分类本系列的前几篇文件,详细了介绍了Vision框架中关于静态图片区域识别的内容。本篇文章,我们将着重介绍静态图片中物体的识别与分类。物体识别和分类也是MachineLearning领域重要的应用。通过大量的图片数据进行训练后,模......
  • LengthFieldPrepender和LengthFieldBasedFrameDecoder
    1,使用LengthFieldPrepender编码,LengthFieldBasedFrameDecoder解码的netty传输......
  • Apache POI库解析Excel文件
    以下是使用ApachePOI库解析Excel文件的示例代码:1、添加POI依赖在pom.xml文件中添加以下依赖:org.apache.poipoi5.1.0org.apache.poipoi-ooxml5.1.02、创建解析器java@ComponentpublicclassExcelParser{publicList<User>parse(InputStreaminputStream,Stri......
  • EasyExcel库实现Excel解析
    以下是使用EasyExcel库实现Excel解析的示例代码:1、添加EasyExcel依赖在pom.xml文件中添加以下依赖:com.alibabaeasyexcel2.2.11定义实体类定义一个实体类,用于映射Excel文件中的每行数据。java@DatapublicclassUser{@ExcelProperty("姓名")privateStringname;@E......
  • vue-element-admin报错Error: error:0308010C:digital envelope routines::unsupporte
    安装vue-element-admin报错 nodejs  Node.jsv18.15.0  opensslErrorStack:['error:03000086:digitalenveloperoutines::initializationerror'],library:'digitalenveloperoutines',reason:'unsupported',code:'ERR_OSSL......
  • ASEMI代理ADI亚德诺ADG5412BRUZ-REEL7车规级芯片
    编辑-ZADG5412BRUZ-REEL7芯片参数:型号:ADG5412BRUZ-REEL7开态电阻:9.8Ω电源断开漏电流:±0.05nA输入高电压:2V输入低电压:0.8V输入电流:0.002μA数字输入电容:2.5pF−3dB带宽:167MHzVDDtoGND:−0.3Vto+48VVSStoGND:+0.3Vto−48V工作温度范围:−40°Cto+125°C......
  • ASEMI代理ADI亚德诺ADG1408YRUZ-REEL7车规级芯片
    编辑-ZADG1408YRUZ-REEL7芯片参数:型号:ADG1408YRUZ-REEL7接通电阻:4Ω电源断开漏电流:±0.04nA输入高电压:2V输入低电压:0.8V输入电流:±0.005μA数字输入电容:4pF过渡时间:140ns−3dB带宽:60MHzVDDtoGND:−0.3Vto+25VVSStoGND:+0.3Vto−25V储存温度范围:−65°......
  • delphiXE10 代码结构高亮线风格单双设置
    勾上就是这个样式: 不勾就是这个样式: ......
  • Django 如何使用 Celery 完成异步任务或定时任务
    以前版本的Celery需要一个单独的库(django-celery)才能与Django一起工作,但从Celery3.1开始,情况便不再如此,我们可以直接通过Celery库来完成在Django中的任务。安装Redis服务端以Docker安装为例,安装一个密码为mypassword的Redis服务端dockerrun-itd--name......