当前位置:首页 > VUE

vue实现tree组件查询

2026-01-21 10:50:54VUE

Vue实现Tree组件查询功能

实现Tree组件查询功能需要结合树形数据结构和搜索逻辑

安装必要依赖(如element-ui的tree组件)

npm install element-ui

基础Tree组件实现

注册并使用el-tree组件

vue实现tree组件查询

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

<script>
export default {
  data() {
    return {
      filterText: '',
      treeData: [{
        label: '一级节点',
        children: [{
          label: '二级节点'
        }]
      }],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  },
  watch: {
    filterText(val) {
      this.$refs.tree.filter(val)
    }
  },
  methods: {
    filterNode(value, data) {
      if (!value) return true
      return data.label.indexOf(value) !== -1
    }
  }
}
</script>

高级搜索功能实现

实现不区分大小写的搜索

filterNode(value, data) {
  if (!value) return true
  return data.label.toLowerCase().indexOf(value.toLowerCase()) !== -1
}

实现多字段搜索

vue实现tree组件查询

filterNode(value, data) {
  if (!value) return true
  return (
    data.label.toLowerCase().includes(value.toLowerCase()) ||
    (data.description && data.description.toLowerCase().includes(value.toLowerCase()))
  )
}

异步加载数据时的搜索

处理异步加载的树节点

async filterNode(value, data, node) {
  if (!value) return true

  // 如果节点未加载完成,先加载子节点
  if (!node.loaded) {
    await this.loadChildNodes(node)
  }

  // 检查当前节点和子节点是否匹配
  return this.checkNodeAndChildren(value, data, node)
}

样式优化

添加搜索高亮效果

// 在filterNode方法中添加高亮逻辑
filterNode(value, data, node) {
  if (!value) {
    node.$el.innerHTML = data.label
    return true
  }

  const match = data.label.match(new RegExp(value, 'i'))
  if (match) {
    const highlighted = data.label.replace(
      new RegExp(value, 'gi'),
      match => `<span style="color: #ff0;background: #f00;">${match}</span>`
    )
    node.$el.innerHTML = highlighted
    return true
  }
  return false
}

性能优化

添加防抖处理频繁搜索

watch: {
  filterText: {
    handler: _.debounce(function(val) {
      this.$refs.tree.filter(val)
    }, 300),
    immediate: false
  }
}

完整组件示例

<template>
  <div>
    <el-input v-model="filterText" placeholder="输入关键字过滤" clearable></el-input>
    <el-tree
      ref="tree"
      :data="treeData"
      :props="defaultProps"
      :filter-node-method="filterNode"
      node-key="id"
      highlight-current
      :expand-on-click-node="false"
    ></el-tree>
  </div>
</template>

<script>
import _ from 'lodash'

export default {
  data() {
    return {
      filterText: '',
      treeData: [],
      defaultProps: {
        children: 'children',
        label: 'name',
        isLeaf: 'leaf'
      }
    }
  },
  created() {
    this.fetchTreeData()
  },
  watch: {
    filterText: _.debounce(function(val) {
      this.$refs.tree.filter(val)
    }, 300)
  },
  methods: {
    async fetchTreeData() {
      // 获取树形数据API调用
      this.treeData = await getTreeData()
    },
    filterNode(value, data, node) {
      if (!value) {
        if (node.$el) node.$el.innerHTML = data.name
        return true
      }

      const lowerValue = value.toLowerCase()
      const match = data.name.toLowerCase().includes(lowerValue)

      if (match && node.$el) {
        const highlighted = data.name.replace(
          new RegExp(value, 'gi'),
          match => `<span class="highlight">${match}</span>`
        )
        node.$el.innerHTML = highlighted
      }

      return match || this.checkChildrenMatch(value, data)
    },
    checkChildrenMatch(value, data) {
      if (!data.children) return false
      return data.children.some(child => this.filterNode(value, child))
    }
  }
}
</script>

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

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

相关文章

vue实现a

vue实现a

Vue 实现 A 功能的方法 在 Vue 中实现 A 功能可以通过多种方式,具体取决于 A 功能的具体需求。以下是几种常见的实现方法: 使用 Vue 组件 通过创建自定义组件来实现 A 功能。组件…

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue实现grid

vue实现grid

Vue 实现 Grid 布局的方法 使用 CSS Grid 布局 Vue 可以结合 CSS Grid 布局实现灵活的网格系统。CSS Grid 是现代浏览器原生支持的布局方案,无需额外依赖库。 &l…

vue实现ssr

vue实现ssr

Vue 实现 SSR(服务端渲染) Vue 的服务端渲染(SSR)允许在服务器端生成完整的 HTML 内容,再发送到客户端,提升首屏加载速度和 SEO 友好性。以下是实现 Vue SSR 的关键步骤和…

vue mvvm实现

vue mvvm实现

Vue MVVM 实现原理 Vue.js 是一个基于 MVVM(Model-View-ViewModel)模式的框架,其核心是通过数据绑定和响应式系统实现视图与数据的自动同步。以下是 Vue 实现 M…

vue底层实现

vue底层实现

Vue.js 的底层实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是其关键实现细节: 响应式系统 Vue 2…