当前位置:首页 > VUE

vue实现树形控件搜索

2026-02-22 06:21:27VUE

Vue 树形控件搜索实现方法

基础树形结构实现

使用 el-tree 组件构建基础树形结构,需设置 node-keyprops 配置项:

<template>
  <el-tree
    :data="treeData"
    :props="defaultProps"
    node-key="id"
    ref="tree"
  ></el-tree>
</template>

<script>
export default {
  data() {
    return {
      treeData: [
        { id: 1, label: '一级节点', children: [...] }
      ],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  }
}
</script>

实现搜索功能

添加搜索输入框并绑定过滤方法:

vue实现树形控件搜索

<template>
  <div>
    <el-input v-model="filterText" placeholder="输入关键字过滤"></el-input>
    <el-tree
      :data="filteredTree"
      :filter-node-method="filterNode"
      ref="tree"
    ></el-tree>
  </div>
</template>

<script>
export default {
  data() {
    return {
      filterText: '',
      originalTree: [...], // 原始数据备份
    }
  },
  computed: {
    filteredTree() {
      return this.filterTree(this.originalTree, this.filterText)
    }
  },
  methods: {
    filterTree(nodes, keyword) {
      if (!keyword) return nodes
      return nodes.filter(node => {
        const match = node.label.includes(keyword)
        if (node.children) {
          node.children = this.filterTree(node.children, keyword)
          return match || node.children.length > 0
        }
        return match
      })
    }
  }
}
</script>

性能优化方案

对于大型树结构,建议采用以下优化:

  1. 添加防抖处理搜索输入

    vue实现树形控件搜索

    watch: {
    filterText: {
     handler: _.debounce(function(val) {
       this.$refs.tree.filter(val)
     }, 500)
    }
    }
  2. 使用虚拟滚动优化渲染性能

    <el-tree-virtual
    :data="treeData"
    :item-size="32"
    height="500px"
    ></el-tree-virtual>

高亮显示匹配项

在树节点中使用插槽实现搜索词高亮:

<el-tree :data="treeData">
  <template #default="{ node, data }">
    <span v-html="highlight(node.label, filterText)"></span>
  </template>
</el-tree>

methods: {
  highlight(text, keyword) {
    if (!keyword) return text
    const reg = new RegExp(keyword, 'gi')
    return text.replace(reg, match => `<span style="color: red">${match}</span>`)
  }
}

完整组件示例

<template>
  <div class="tree-search-container">
    <el-input
      v-model="filterText"
      placeholder="输入搜索内容"
      clearable
    />
    <el-tree
      ref="treeRef"
      :data="filteredData"
      :props="defaultProps"
      :filter-node-method="filterNode"
      default-expand-all
    />
  </div>
</template>

<script>
export default {
  data() {
    return {
      filterText: '',
      defaultProps: {
        children: 'children',
        label: 'label'
      },
      treeData: [
        // 树形数据
      ]
    }
  },
  computed: {
    filteredData() {
      return this.filterTree([...this.treeData], this.filterText)
    }
  },
  methods: {
    filterTree(nodes, keyword) {
      if (!keyword) return nodes
      return nodes.filter(node => {
        const match = node.label.toLowerCase().includes(keyword.toLowerCase())
        if (node.children) {
          node.children = this.filterTree(node.children, keyword)
          return match || node.children.length > 0
        }
        return match
      })
    },
    filterNode(value, data) {
      if (!value) return true
      return data.label.toLowerCase().includes(value.toLowerCase())
    }
  }
}
</script>

标签: 控件vue
分享给朋友:

相关文章

vue实现本地数据存储

vue实现本地数据存储

使用 localStorage 或 sessionStorage Vue 中可以直接调用浏览器提供的 localStorage 或 sessionStorage API 进行数据存储。localSto…

vue实现下拉层级

vue实现下拉层级

Vue实现下拉层级菜单 使用Vue实现下拉层级菜单可以通过递归组件或动态渲染的方式完成。以下是两种常见实现方法: 递归组件实现 创建一个递归组件处理多级菜单结构: <template>…

vue实现旋转

vue实现旋转

Vue 实现旋转效果的方法 在 Vue 中实现旋转效果可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 动画 通过 Vue 的 :class 或 :style 绑定 CSS 动画实现旋转效…

vue实现 弹窗

vue实现 弹窗

Vue 实现弹窗的基本方法 使用 Vue 实现弹窗可以通过多种方式,包括组件化、指令、插件等。以下是几种常见的实现方法。 组件化实现弹窗 创建一个独立的弹窗组件,通过 props 控制显示与隐藏。…

vue实现循环

vue实现循环

Vue 实现循环的方法 在 Vue 中,可以通过 v-for 指令实现循环渲染列表或对象。以下是几种常见的用法: 遍历数组 使用 v-for 遍历数组时,可以同时获取当前项和索引: <ul&…

自己实现vue

自己实现vue

实现简易版 Vue.js 核心功能 要实现一个简易版 Vue.js,需要理解其核心功能:数据响应式、模板编译、依赖收集和虚拟 DOM。以下分模块实现关键功能。 数据响应式(Reactivity) 通…