当前位置:首页 > VUE

vue树形展示实现

2026-01-19 11:35:42VUE

Vue 树形展示实现方法

使用递归组件实现树形结构

递归组件是 Vue 中实现树形结构的常见方式。通过组件调用自身,可以轻松处理嵌套数据。

<template>
  <ul>
    <li v-for="item in treeData" :key="item.id">
      {{ item.name }}
      <tree-node v-if="item.children" :treeData="item.children"></tree-node>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeNode',
  props: {
    treeData: Array
  }
}
</script>

数据格式通常为:

[
  {
    id: 1,
    name: '父节点',
    children: [
      {
        id: 2,
        name: '子节点'
      }
    ]
  }
]

使用第三方组件库

Element UI、Ant Design Vue 等流行 UI 库都提供了现成的树形组件。

Element UI 示例:

<el-tree
  :data="treeData"
  :props="defaultProps"
  @node-click="handleNodeClick">
</el-tree>

<script>
export default {
  data() {
    return {
      treeData: [/* 树形数据 */],
      defaultProps: {
        children: 'children',
        label: 'name'
      }
    }
  }
}
</script>

实现展开/折叠功能

为树形节点添加展开/折叠功能需要维护一个状态:

<template>
  <div>
    <div @click="toggle">
      {{ node.name }}
      <span v-if="hasChildren">{{ isOpen ? '-' : '+' }}</span>
    </div>
    <div v-show="isOpen" v-if="hasChildren">
      <tree-node
        v-for="child in node.children"
        :key="child.id"
        :node="child">
      </tree-node>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isOpen: false
    }
  },
  computed: {
    hasChildren() {
      return this.node.children && this.node.children.length
    }
  },
  methods: {
    toggle() {
      this.isOpen = !this.isOpen
    }
  }
}
</script>

添加复选框功能

实现带复选框的树形组件需要处理选中状态:

<template>
  <div>
    <input
      type="checkbox"
      v-model="node.checked"
      @change="handleCheckChange">
    <span>{{ node.name }}</span>
    <div v-if="node.children">
      <tree-node
        v-for="child in node.children"
        :key="child.id"
        :node="child"
        @check-change="propagateCheckChange">
      </tree-node>
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    handleCheckChange() {
      this.$emit('check-change', this.node)
    },
    propagateCheckChange(node) {
      this.$emit('check-change', node)
    }
  }
}
</script>

性能优化建议

对于大型树形结构,使用虚拟滚动技术可以显著提高性能:

<template>
  <virtual-list
    :size="30"
    :remain="8"
    :data="treeData">
    <tree-node
      slot-scope="{ item }"
      :node="item">
    </tree-node>
  </virtual-list>
</template>

动态加载数据

实现懒加载功能可以优化初始加载时间:

<el-tree
  :load="loadNode"
  lazy>
</el-tree>

<script>
export default {
  methods: {
    loadNode(node, resolve) {
      if (node.level === 0) {
        return resolve([{ name: '根节点' }])
      }
      if (node.level > 3) return resolve([])

      setTimeout(() => {
        resolve([
          { name: '子节点' + new Date().getTime() }
        ])
      }, 500)
    }
  }
}
</script>

vue树形展示实现

标签: vue
分享给朋友:

相关文章

vue如何实现冒泡

vue如何实现冒泡

Vue 实现冒泡排序 在 Vue 中实现冒泡排序,可以通过数据绑定和响应式特性动态展示排序过程。以下是一个完整的实现示例,包含代码和详细说明。 数据准备 在 Vue 的 data 中定义一个数组作为…

课程表vue实现

课程表vue实现

实现课程表的Vue组件 创建课程表需要设计数据结构、布局和交互逻辑。以下是一个基于Vue 3的实现方案: 数据结构设计 const timetableData = ref([ { ti…

vue如何实现到期提醒

vue如何实现到期提醒

实现 Vue 到期提醒功能 使用计算属性计算剩余时间 在 Vue 组件中定义一个计算属性,计算目标日期与当前日期的差值。通过 Date 对象获取时间戳并计算剩余天数或小时数。 computed: {…

vue设计与实现 书

vue设计与实现 书

vue设计与实现 书 《Vue.js设计与实现》是一本深入探讨Vue.js框架内部原理和设计思想的书籍,适合希望深入理解Vue.js的开发者。以下是关于这本书的详细信息: 书籍内容 《Vue.js…

vue自己实现下拉导航

vue自己实现下拉导航

实现下拉导航的基本思路 在Vue中实现下拉导航,可以通过结合Vue的响应式数据和事件绑定特性来完成。主要思路是利用v-show或v-if控制下拉菜单的显示与隐藏,并通过鼠标事件或点击事件触发状态变化。…

vue实现autocomplete

vue实现autocomplete

Vue 实现 Autocomplete 功能 Vue 中实现 Autocomplete(自动完成)功能可以通过自定义组件或使用现有库完成。以下是几种常见方法: 方法一:使用 Vue 原生实现…