当前位置: 首页 > article >正文

Vue el-tree 加载过滤出的父节点以及其包含的子节点

由于el-tree提供的过滤函数,过滤出来的目录节点不包含子节点,因此需要改造过滤函数,使其过滤出的目录节点包含子节点。

<template>
  <div>
    <el-input placeholder="请输入内容" v-model="filterText" clearable>
    </el-input>
    <el-tree :data="treeData" :filter-node-method="filterNode" ref="tree">
    </el-tree>
  </div>
</template>

<script>
export default {
  data() {
    return {
      filterText: "",
      treeData: [
        {
          id: 1,
          label: "一级 1",
          children: [
            {
              id: 4,
              label: "二级 1-1",
              children: [
                {
                  id: 9,
                  label: "三级 1-1-1",
                },
                {
                  id: 10,
                  label: "三级 1-1-2",
                },
              ],
            },
          ],
        },
        {
          id: 2,
          label: "一级 2",
          children: [
            {
              id: 5,
              label: "二级 2-1",
            },
            {
              id: 6,
              label: "二级 2-2",
            },
          ],
        },
        {
          id: 3,
          label: "一级 3",
          children: [
            {
              id: 7,
              label: "二级 3-1",
            },
            {
              id: 8,
              label: "二级 3-2",
            },
          ],
        },
      ],
    };
  },
  //实现输入就进行筛选功能,进行监听该值的变化
  watch: {
    filterText(val) {
      this.$refs.tree.filter(val);
    },
  },
  methods: {
    // 方法1
    //因为需要筛选出过滤的父节点以及其所有子节点,只调用element-ui自带的方法只会返回对应的数据,因此需要进行改造筛选条件
    filterNode(value, data, node) {
      if (!value) return true;
      // return data.label.indexOf(value) !== -1;//原有代码 不包含子节点
      let _array = []; //这里使用数组存储 只是为了存储值。
      this.getReturnNode(node, _array, value);
      let result = false;
      _array.forEach((item) => {
        result = result || item;
      });
      return result;
    },
    getReturnNode(node, _array, value) {
      let isPass =
        node.data && node.data.label && node.data.label.indexOf(value) !== -1;
      isPass ? _array.push(isPass) : "";
      if (!isPass && node.level != 1 && node.parent) {
        this.getReturnNode(node.parent, _array, value);
      }
    },

    // 方法2 速度更快
    filterNode(value, data, node) {
      if (!value) return true;
      // return data.label.indexOf(value) !== -1;//原有代码 不包含子节点
      let parentNode = node.parent,
        labels = [node.label],
        level = 1;
      while (level < node.level) {
        labels = [...labels, parentNode.label];
        parentNode = parentNode.parent;
        level++;
      }
      return labels.some((label) => label.indexOf(value) !== -1);
    },
  },
};
</script>

原有效果

在这里插入图片描述

改造后效果

在这里插入图片描述


http://www.kler.cn/a/535267.html

相关文章:

  • 代码随想录算法训练营| 二叉树总结
  • 【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信
  • Golang 并发机制-6:掌握优雅的错误处理艺术
  • docker安装es及分词器ik
  • Linux 源码编译安装httpd 2.4,提供系统服务管理脚本并测试
  • 网络爬虫js逆向之某音乐平台案例
  • Flowmix/Docx 多模态文档编辑器春节更新!日期组件 + 一键生成区块链接,效率飞升!...
  • ubuntu安装deepseek
  • 【教学】推送docker仓库
  • 关于使用numpy进行数据解析性能优化的几点认识
  • 反向代理模块你那会
  • Java数据结构与算法之“树”
  • 【BUUCTF逆向题】[MRCTF2020]Transform
  • 用NeuralProphet预测股价:AI金融新利器(附源码)
  • FPGA与ASIC:到底选哪个好?
  • 如何安装LangChain软件包
  • intra-mart实现简易登录页面笔记
  • C语言之函数指针
  • wait/notify/join/设计模式
  • 无人机动力套(电机、电调)技术详解
  • mysql8的并行复制介绍
  • Git 远程仓库的操作与协作
  • 离散浣熊优化算法(DCOA)求解大规模旅行商问题(Large-Scale Traveling Salesman Problem,LTSP),MATLAB代码
  • 基于Typescript,使用Vite构建融合Vue.js的Babylon.js开发环境
  • 2025年Android NDK超全版本下载地址
  • Pycharm 2024版本出现 We could not validate your license怎么办?解决方法一步到位!