返回

如何用el-tree组件实现搜索、展开、高亮

前端

如何在Vue中使用el-tree组件实现搜索、展开、高亮

概述

在前端开发中,树形结构是展示数据的常见方式。Vue生态系统中,el-tree组件提供了一种强大的解决方案,可以轻松实现树形结构的可视化。本文将深入探讨如何使用el-tree组件实现搜索、展开和高亮功能,提升用户体验并简化数据查找。

搜索功能

el-tree组件支持两种实现搜索功能的方法:

方法一:filterNode方法

该方法通过filterNode选项传入一个回调函数,该函数接收两个参数:搜索值和节点数据。当搜索值不为空时,回调函数返回true以显示节点,否则返回false。

<template>
  <el-tree :data="data" :filter-node-method="filterNode"></el-tree>
</template>

<script>
import { ElTree } from 'element-plus'

export default {
  components: {
    ElTree
  },
  methods: {
    filterNode(value, data) {
      if (!value) return true
      return data.label.indexOf(value) !== -1
    }
  }
}
</script>

方法二:filter方法

该方法利用@filter-change事件监听器。当搜索值发生变化时,调用filter方法,传入搜索值。

<template>
  <el-tree @filter-change="filterChange"></el-tree>
</template>

<script>
import { ElTree } from 'element-plus'

export default {
  components: {
    ElTree
  },
  methods: {
    filterChange(value) {
      this.$refs.tree2.filter(value)
    }
  }
}
</script>

展开和高亮功能

el-tree组件提供便捷的方式实现节点的展开和高亮效果:

展开功能

通过default-expand-all属性可以默认展开所有节点,或者通过expand-on-click-node属性在单击节点时展开。

<template>
  <el-tree :data="data" default-expand-all></el-tree>
</template>

<script>
import { ElTree } from 'element-plus'

export default {
  components: {
    ElTree
  }
}
</script>

高亮功能

利用current-key属性和highlight-current属性,可以高亮当前选中的节点。

<template>
  <el-tree :data="data" :current-key="currentKey" highlight-current></el-tree>
</template>

<script>
import { ElTree } from 'element-plus'

export default {
  components: {
    ElTree
  },
  data() {
    return {
      currentKey: null
    }
  }
}
</script>

示例代码

<template>
  <div>
    <el-input v-model="searchValue" placeholder="搜索..."></el-input>
    <el-tree :data="data" :filter-node-method="filterNode" default-expand-all highlight-current :current-key="currentKey"></el-tree>
  </div>
</template>

<script>
import { ElTree, ElInput } from 'element-plus'

export default {
  components: {
    ElTree,
    ElInput
  },
  data() {
    return {
      data: [
        {
          id: 1,
          label: 'Node 1',
          children: [
            {
              id: 2,
              label: 'Node 1-1'
            },
            {
              id: 3,
              label: 'Node 1-2'
            }
          ]
        },
        {
          id: 4,
          label: 'Node 2',
          children: [
            {
              id: 5,
              label: 'Node 2-1'
            },
            {
              id: 6,
              label: 'Node 2-2'
            }
          ]
        }
      ],
      searchValue: '',
      currentKey: null
    }
  },
  methods: {
    filterNode(value, data) {
      if (!value) return true
      return data.label.indexOf(value) !== -1
    }
  }
}
</script>

常见问题解答

  1. 如何获取选中的节点数据?

    通过@node-click事件监听器可以获取选中的节点数据。

  2. 如何禁用节点展开?

    设置expand-on-click-node属性为false即可禁用节点展开。

  3. 如何更改节点标签的样式?

    通过node-class-name属性可以为节点标签设置自定义样式类。

  4. 如何动态加载节点数据?

    通过load选项传入一个回调函数,在需要加载节点数据时触发。

  5. 如何实现懒加载?

    lazy属性设置为true即可实现懒加载,只在展开节点时加载数据。