当前位置:首页 > VUE

vue实现树目录

2026-01-08 05:57:26VUE

Vue 实现树形目录

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

递归组件实现

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

<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 库组件。

<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 可以完全自定义每个节点的渲染方式。

vue实现树目录

<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 实现滑动输入条 使用原生 HTML5 input range 实现 在 Vue 模板中直接使用 <input type="range">,通过 v-model 绑定数据:…

vue grid实现

vue grid实现

Vue Grid 实现方法 在 Vue 中实现网格布局可以通过多种方式完成,包括使用原生 CSS Grid、第三方组件库或自定义组件。以下是几种常见方法: 使用原生 CSS Grid 通过 Vue…

vue compile 实现

vue compile 实现

Vue 编译实现原理 Vue 的编译过程将模板字符串转换为渲染函数,主要分为解析、优化和代码生成三个阶段。 解析阶段(Parse) 将模板字符串转换为抽象语法树(AST)。Vue 使用正则表达式和有…

vue实现slidetoggle

vue实现slidetoggle

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

vue实现横滚

vue实现横滚

Vue 实现横滚效果 横滚效果通常指水平滚动内容,常见于轮播图、横向导航栏等场景。以下是几种实现方式: 使用 CSS 和 Vue 结合 通过 CSS 的 overflow-x 和 white-spa…

vue实现搜索查询

vue实现搜索查询

Vue 实现搜索查询的方法 双向绑定实现实时搜索 在Vue中可以通过v-model绑定输入框的值,结合计算属性或watch监听输入变化实现实时搜索。 <template> <i…