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

实现搜索功能

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

<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. 添加防抖处理搜索输入

    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>

高亮显示匹配项

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

vue实现树形控件搜索

<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实现图库

Vue 实现图库的基本方法 使用 Vue 实现图库功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用 Vue 和第三方库(如 Vue Gallery) 安装 vue-gallery 或…

vue 实现音乐

vue 实现音乐

Vue 实现音乐播放功能 在 Vue 中实现音乐播放功能,可以通过 HTML5 的 <audio> 元素或第三方库如 howler.js 来实现。以下是两种方法的详细步骤: 使用 HTM…

vue打包实现推送

vue打包实现推送

Vue 项目打包与自动化部署推送 打包 Vue 项目 使用以下命令生成生产环境代码,默认输出到 dist 目录: npm run build 配置自动化推送(以 GitHub Pages 为例)…

vue radio组件实现

vue radio组件实现

Vue Radio 组件实现 在 Vue 中实现 Radio 组件可以通过原生 HTML 的 <input type="radio"> 结合 Vue 的响应式特性,或者使用第三方 UI 库…

vue实现登录注册

vue实现登录注册

Vue 登录注册功能实现 项目初始化 使用 Vue CLI 创建项目,安装必要依赖(如 Vue Router、Axios): vue create auth-demo cd auth-demo np…

vue搜索过后实现分页

vue搜索过后实现分页

实现 Vue 搜索后分页的方法 数据绑定与搜索逻辑 在 Vue 组件中定义数据属性,包括原始数据列表、搜索关键词、分页相关参数: data() { return { originalLi…