当前位置:首页 > 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实现app

vue实现app

Vue 实现 App 的常见方法 使用 Vue 开发移动端 App 主要有两种主流方案:混合开发(Hybrid)和原生渲染。以下是具体实现方式和工具链: 混合开发方案(WebView 嵌入) 通…

vue 实现单选

vue 实现单选

使用 v-model 绑定单选值 在 Vue 中,可以通过 v-model 绑定单选按钮的值。定义一个响应式数据(如 selectedOption),并将其与单选按钮的 value 属性关联。…

vue实现active

vue实现active

Vue 实现 active 状态的方法 在 Vue 中实现 active 状态可以通过以下几种方式实现,具体取决于使用场景和需求。 使用 v-bind:class 动态绑定类名 通过 v-bind:…

vue实现导出

vue实现导出

Vue 实现导出功能的方法 在 Vue 项目中实现导出功能通常涉及将数据导出为 Excel、CSV 或其他格式。以下是几种常见的实现方式: 使用 xlsx 库导出 Excel 安装 xlsx 库:…

vue实现抖动

vue实现抖动

Vue 实现抖动效果 在 Vue 中实现抖动效果可以通过 CSS 动画或 JavaScript 动画库来实现。以下是几种常见的方法: 使用 CSS 动画 通过定义 @keyframes 动画并在…

vue实现树

vue实现树

Vue 实现树形结构的方法 使用递归组件实现树形结构 递归组件是Vue中实现树形结构的常见方式。通过组件调用自身,可以轻松构建多层嵌套的树形数据。 <template> <ul…