当前位置:首页 > VUE

vue实现tree组件查询

2026-02-22 02:18:38VUE

Vue实现Tree组件查询功能

基本Tree组件结构

需要先构建一个基础的Tree组件,包含节点渲染和展开/折叠功能。每个节点应包含labelchildren等属性。

<template>
  <div class="tree">
    <tree-node 
      v-for="node in filteredData"
      :key="node.id"
      :node="node"
      @toggle="toggleNode"
    />
  </div>
  <input v-model="searchQuery" placeholder="搜索节点..." />
</template>

<script>
export default {
  data() {
    return {
      treeData: [],
      searchQuery: ''
    }
  },
  computed: {
    filteredData() {
      if (!this.searchQuery) return this.treeData
      return this.filterTree(this.treeData, this.searchQuery)
    }
  },
  methods: {
    filterTree(nodes, query) {
      return nodes.filter(node => {
        const match = node.label.includes(query)
        if (match) return true

        if (node.children) {
          const filteredChildren = this.filterTree(node.children, query)
          if (filteredChildren.length > 0) {
            node.children = filteredChildren
            return true
          }
        }
        return false
      })
    },
    toggleNode(node) {
      node.expanded = !node.expanded
    }
  }
}
</script>

搜索功能实现

搜索功能需要递归遍历树结构,匹配节点名称并保留匹配节点的父级路径。

filterTree(nodes, query) {
  const lowerQuery = query.toLowerCase()
  return nodes.reduce((result, node) => {
    const lowerLabel = node.label.toLowerCase()
    const isMatch = lowerLabel.includes(lowerQuery)

    let children = []
    if (node.children) {
      children = this.filterTree(node.children, query)
      const hasMatchingChild = children.length > 0
    }

    if (isMatch || hasMatchingChild) {
      const newNode = { ...node }
      if (hasMatchingChild) {
        newNode.children = children
      }
      result.push(newNode)
    }

    return result
  }, [])
}

高亮匹配文本

在渲染节点时,对匹配的搜索文本进行高亮显示。

<template>
  <div class="tree-node">
    <div @click="toggle">
      <span v-html="highlightText(node.label)"></span>
    </div>
    <div v-if="node.expanded && node.children">
      <tree-node
        v-for="child in node.children"
        :key="child.id"
        :node="child"
        @toggle="$emit('toggle', $event)"
      />
    </div>
  </div>
</template>

<script>
export default {
  props: ['node'],
  methods: {
    highlightText(text) {
      if (!this.$parent.searchQuery) return text
      const query = this.$parent.searchQuery
      return text.replace(
        new RegExp(query, 'gi'),
        match => `<span class="highlight">${match}</span>`
      )
    },
    toggle() {
      this.$emit('toggle', this.node)
    }
  }
}
</script>

<style>
.highlight {
  background-color: yellow;
  font-weight: bold;
}
</style>

性能优化

对于大型树结构,需要优化搜索性能。

// 使用防抖减少频繁搜索带来的性能问题
import { debounce } from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      debouncedFilter: null
    }
  },
  created() {
    this.debouncedFilter = debounce(this.doFilter, 300)
  },
  watch: {
    searchQuery(newVal) {
      this.debouncedFilter(newVal)
    }
  },
  methods: {
    doFilter(query) {
      this.filteredData = this.filterTree(this.treeData, query)
    }
  }
}

完整组件示例

整合所有功能的完整Tree组件实现。

<template>
  <div>
    <input 
      v-model="searchQuery" 
      placeholder="搜索节点..."
      class="search-input"
    />
    <div class="tree-container">
      <tree-node
        v-for="node in filteredData"
        :key="node.id"
        :node="node"
        :search-query="searchQuery"
        @toggle="toggleNode"
      />
    </div>
  </div>
</template>

<script>
import TreeNode from './TreeNode.vue'

export default {
  components: { TreeNode },
  props: {
    data: {
      type: Array,
      required: true
    }
  },
  data() {
    return {
      searchQuery: '',
      treeData: this.data
    }
  },
  computed: {
    filteredData() {
      return this.searchQuery 
        ? this.filterTree(this.treeData, this.searchQuery)
        : this.treeData
    }
  },
  methods: {
    filterTree(nodes, query) {
      // 实现同上
    },
    toggleNode(node) {
      node.expanded = !node.expanded
      this.$forceUpdate()
    }
  }
}
</script>

这些方法提供了在Vue中实现可搜索Tree组件的基本方案,可以根据实际需求进行调整和扩展。

vue实现tree组件查询

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

相关文章

vue表格重置怎么实现

vue表格重置怎么实现

重置表格数据的方法 在Vue中重置表格数据通常需要操作绑定的数据源,以下是几种常见实现方式: 直接重置数据源 // 假设表格绑定的是tableData this.tableData = [...t…

vue实现积分

vue实现积分

Vue 实现积分功能 在 Vue 中实现积分功能通常涉及前端展示、交互逻辑以及与后端 API 的通信。以下是常见的实现方法和步骤: 积分展示组件 创建一个积分展示组件,用于显示当前用户的积分。可以使…

vue 实现tabs

vue 实现tabs

Vue 实现 Tabs 组件的方法 使用动态组件和 v-for 在 Vue 中实现 Tabs 可以通过动态组件和 v-for 指令结合完成。定义一个 tabs 数组,包含每个标签的标题和对应的组件。…

vue实现方法

vue实现方法

Vue 实现方法 Vue 是一种流行的前端框架,用于构建用户界面和单页应用。以下是几种常见的 Vue 实现方法: 创建 Vue 实例 通过 new Vue() 创建一个 Vue 实例,传入配置对象,…

vue slot实现

vue slot实现

vue slot 的实现方法 在 Vue 中,slot 是一种内容分发机制,允许父组件向子组件传递模板内容。以下是几种常见的 slot 实现方式: 默认 slot 默认 slot 是最基础的 slo…

vue实现机制

vue实现机制

Vue 实现机制的核心原理 Vue.js 的核心实现机制主要基于响应式系统、虚拟 DOM 和组件化设计。以下是关键实现细节: 响应式系统 Vue 通过 Object.defineProperty(V…