当前位置:首页 > VUE

vue实现树目录

2026-01-08 05:57:26VUE

Vue 实现树形目录

在 Vue 中实现树形目录可以通过递归组件或第三方库(如 element-uiel-tree)完成。以下是两种常见实现方式:

递归组件实现

递归组件适合自定义程度高的树形结构,通过组件调用自身实现嵌套渲染。

vue实现树目录

<template>
  <div>
    <tree-node :node="treeData" @on-click="handleNodeClick"></tree-node>
  </div>
</template>

<script>
export default {
  components: {
    TreeNode: {
      name: 'TreeNode',
      props: ['node'],
      template: `
        <ul>
          <li @click.stop="toggle">
            {{ node.label }}
            <span v-if="hasChildren">[{{ isOpen ? '-' : '+' }}]</span>
          </li>
          <template v-if="isOpen && hasChildren">
            <tree-node 
              v-for="child in node.children" 
              :key="child.id" 
              :node="child"
              @on-click="$emit('on-click', $event)"
            />
          </template>
        </ul>
      `,
      data() {
        return { isOpen: false }
      },
      computed: {
        hasChildren() {
          return this.node.children && this.node.children.length
        }
      },
      methods: {
        toggle() {
          if (this.hasChildren) {
            this.isOpen = !this.isOpen
          } else {
            this.$emit('on-click', this.node)
          }
        }
      }
    }
  },
  data() {
    return {
      treeData: {
        id: 1,
        label: 'Root',
        children: [
          { id: 2, label: 'Child 1' },
          { 
            id: 3, 
            label: 'Child 2',
            children: [
              { id: 4, label: 'Grandchild 1' }
            ]
          }
        ]
      }
    }
  },
  methods: {
    handleNodeClick(node) {
      console.log('Clicked node:', node)
    }
  }
}
</script>

使用 Element UI 的 el-tree

对于快速实现标准化树形结构,可以使用现成的 UI 库组件。

vue实现树目录

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

<script>
export default {
  data() {
    return {
      treeData: [{
        label: 'Level 1',
        children: [{
          label: 'Level 2',
          children: [{
            label: 'Level 3'
          }]
        }]
      }],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  },
  methods: {
    handleNodeClick(data) {
      console.log('Clicked node:', data)
    }
  }
}
</script>

动态加载数据

当需要异步加载节点数据时,可以结合 API 请求实现。

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

<script>
export default {
  data() {
    return {
      props: {
        label: 'name',
        children: 'zones',
        isLeaf: 'leaf'
      }
    }
  },
  methods: {
    loadNode(node, resolve) {
      if (node.level === 0) {
        return resolve([{ name: 'Region' }])
      }
      if (node.level > 3) return resolve([])

      setTimeout(() => {
        const data = Array(3).fill(null).map((_, i) => ({
          name: `Zone ${node.level}-${i}`,
          leaf: node.level >= 2
        }))
        resolve(data)
      }, 500)
    }
  }
}
</script>

自定义节点内容

通过 scoped slot 可以完全自定义每个节点的渲染方式。

<template>
  <el-tree :data="data">
    <template #default="{ node, data }">
      <span class="custom-node">
        <span>{{ node.label }}</span>
        <span v-if="!node.isLeaf">
          ({{ node.childNodes.length }})
        </span>
      </span>
    </template>
  </el-tree>
</template>

关键注意事项

  • 递归组件需要设置 name 属性才能在模板中调用自身
  • 树形数据通常需要唯一 key 标识每个节点
  • 大数据量时考虑虚拟滚动优化性能
  • 复杂交互(如拖拽、复选框)建议直接使用成熟组件库实现

以上方案可根据项目需求选择,自定义组件适合特殊UI需求,而UI库组件能快速实现标准功能。

标签: 目录vue
分享给朋友:

相关文章

vue实现选区创建

vue实现选区创建

Vue 实现选区创建的方法 在 Vue 中实现选区创建通常涉及 DOM 操作和事件处理。以下是几种常见的方法: 使用原生 DOM API 通过 window.getSelection() 和 Ran…

vue怎么实现选中删除

vue怎么实现选中删除

实现选中删除功能的方法 在Vue中实现选中删除功能通常涉及以下几个关键步骤: 数据绑定与选中状态管理 使用v-model或v-for指令绑定列表数据,结合复选框或单选按钮实现选中状态管理。例如…

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 使用window.print()方法 这是最简单的打印方式,直接调用浏览器的打印功能。 meth…

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debou…

vue实现用户信息表

vue实现用户信息表

Vue 实现用户信息表的方法 使用 Vue CLI 创建项目 安装 Vue CLI 并初始化项目: npm install -g @vue/cli vue create user-info-tab…

vue实现一个标签选择

vue实现一个标签选择

Vue 标签选择组件实现 基础实现 使用 Vue 的 v-for 和 v-model 指令可以快速实现标签选择功能: <template> <div class="tag-s…