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

vue 指令实现

Vue 指令实现 Vue 指令是 Vue.js 提供的特殊属性,用于在 DOM 元素上添加特殊行为。指令以 v- 前缀开头,例如 v-model、v-if、v-for 等。以下是实现自定义指令和常用内…

vue 实现脚本

vue 实现脚本

Vue 实现脚本的方法 Vue.js 提供了多种方式来实现脚本功能,包括组件内脚本、混入(Mixins)、插件(Plugins)以及自定义指令等。以下是常见的实现方式: 组件内脚本 在 Vue 单文…

vue 实现fadeout

vue 实现fadeout

Vue 实现淡出效果 在 Vue 中实现淡出(fade-out)效果可以通过 CSS 过渡或动画结合 Vue 的动态渲染功能完成。以下是几种常见方法: 使用 Vue 过渡(Transition)组件…

vue实现slidetoggle

vue实现slidetoggle

Vue 实现 SlideToggle 效果 SlideToggle 是一种常见的交互效果,元素以滑动方式展开或收起。以下是几种实现方法: 使用 CSS Transition 和 v-show…

vue轮播实现

vue轮播实现

Vue 轮播实现方法 使用第三方库(推荐) 安装 swiper 或 vue-awesome-swiper 库,快速实现功能丰富的轮播效果。 以 vue-awesome-swiper 为例: npm…

vue 实现跳转

vue 实现跳转

Vue 实现页面跳转的方法 在 Vue 中实现页面跳转通常可以通过以下几种方式实现,具体选择取决于项目需求和技术栈(如是否使用 Vue Router)。 使用 Vue Router 进行编程式导航…