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

vue3+element-plus+el-tree-v2实现节点过滤

使用 Element Plus 的 el-tree-v2 实现树形组件节点过滤
需求:通过输入框输入关键字,动态过滤树形节点,只显示匹配的节点及其父节点

实现代码:

<template>
  <div>
    <!-- 输入框用于输入过滤条件 -->
    <el-input
      v-model="filterText"
      placeholder="输入关键字进行过滤"
      clearable
    />

    <!-- el-tree-v2 组件 -->
    <el-tree-v2
      :data="filteredTreeData"
      :props="defaultProps"
      :height="400"
      node-key="id"
    />
  </div>
</template>

<script setup>
import { ref, computed } from 'vue';

// 过滤条件
const filterText = ref('');

// 原始树形数据
const treeData = ref([
  {
    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' },
    ],
  },
]);

// 树形结构的属性配置
const defaultProps = ref({
  children: 'children',
  label: 'label',
});

// 过滤后的树形数据
const filteredTreeData = computed(() => {
  if (!filterText.value) return treeData.value; // 如果过滤条件为空,返回完整数据

  // 递归过滤树形数据
  const filterNode = (node) => {
    // 检查 node.label 是否存在
    if (node.label && node.label.includes(filterText.value)) {
      return true; // 如果当前节点匹配,保留
    }

    if (node.children) {
      node.children = node.children.filter(filterNode); // 递归过滤子节点
      return node.children.length > 0; // 如果子节点有匹配项,保留当前节点
    }

    return false; // 不匹配的节点移除
  };

  // 对树形数据进行深拷贝,避免修改原始数据
  return JSON.parse(JSON.stringify(treeData.value)).filter(filterNode);
});
</script>

<style scoped>
.el-input {
  margin-bottom: 20px;
}
</style>

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

相关文章:

  • 批量查询数据库中符合条件的文档,并把每个文档转换为相应的类实例后返回一个列表
  • 案例:使用网络命名空间模拟多主机并通过网桥访问外部网络
  • c# 2025-3-22 周六
  • 再读强化学习24March
  • ESP32 BLE 初步学习笔记
  • API架构风格
  • 【机器学习】什么是逻辑回归?
  • Unity 游戏开发:从新手到大师的进阶之路
  • 网络安全威胁与防护措施(下)
  • vue 点击放大,图片预览效果
  • Azure Delta Lake、Databricks和Event Hubs实现实时欺诈检测
  • trino查询mysql报Unknown or incorrect time zone: ‘Asia/Shanghai‘
  • spring +kotlin 配置redis 和redis的常用方法
  • AI大模型全攻略:原理 · 部署 · Prompt · 场景应用
  • 大数据E10:基于Spark和Scala编程解决一些基本的数据处理和统计分析,去重、排序等
  • 【Vue3入门1】01-Vue3的基础 + ref reactive
  • Golang 老题,生产者和消费者模型,先后关闭通道的问题
  • STM32 ADC和DAC详解
  • [React 进阶系列] 组合组件 复合组件
  • 矩阵指数的定义和基本性质