当前位置:首页 > VUE

vue中实现tree

2026-03-28 17:36:59VUE

Vue 中实现 Tree 组件

数据结构设计

Tree 组件通常需要一个嵌套的树形数据结构。每个节点包含 labelchildren 等属性。

const treeData = [
  {
    label: 'Node 1',
    children: [
      {
        label: 'Node 1-1',
        children: []
      }
    ]
  }
]

递归组件实现

使用 Vue 的递归组件特性实现 Tree。组件通过 name 属性调用自身。

<template>
  <ul>
    <li v-for="node in data" :key="node.label">
      {{ node.label }}
      <tree-node v-if="node.children && node.children.length" :data="node.children"/>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeNode',
  props: {
    data: {
      type: Array,
      required: true
    }
  }
}
</script>

展开/折叠功能

通过 v-ifv-show 控制子节点的显示隐藏,添加点击事件切换状态。

vue中实现tree

<template>
  <ul>
    <li v-for="node in data" :key="node.label">
      <span @click="toggle(node)">{{ node.expanded ? '-' : '+' }}</span>
      {{ node.label }}
      <tree-node v-if="node.expanded && node.children" :data="node.children"/>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeNode',
  props: {
    data: {
      type: Array,
      required: true
    }
  },
  methods: {
    toggle(node) {
      node.expanded = !node.expanded
    }
  }
}
</script>

选中状态管理

通过 v-model 或自定义事件实现节点选中功能。

<template>
  <ul>
    <li v-for="node in data" :key="node.label">
      <input type="checkbox" v-model="node.checked" @change="handleCheck(node)">
      {{ node.label }}
      <tree-node v-if="node.expanded && node.children" :data="node.children"/>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeNode',
  props: {
    data: {
      type: Array,
      required: true
    }
  },
  methods: {
    handleCheck(node) {
      this.$emit('check-change', node)
    }
  }
}
</script>

动态加载节点

对于大数据量场景,实现按需加载子节点。

vue中实现tree

<template>
  <ul>
    <li v-for="node in data" :key="node.label">
      <span @click="loadChildren(node)">{{ node.loading ? 'Loading...' : '+' }}</span>
      {{ node.label }}
      <tree-node v-if="node.children" :data="node.children"/>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeNode',
  props: {
    data: {
      type: Array,
      required: true
    }
  },
  methods: {
    async loadChildren(node) {
      if (!node.children) {
        node.loading = true
        node.children = await fetchChildren(node.id)
        node.loading = false
      }
    }
  }
}
</script>

样式优化

添加 CSS 样式提升 Tree 组件的视觉效果。

ul {
  list-style-type: none;
  padding-left: 20px;
}

li {
  cursor: pointer;
  margin: 5px 0;
}

span {
  margin-right: 5px;
}

完整示例

整合上述功能实现完整的 Tree 组件。

<template>
  <div class="tree">
    <tree-node :data="treeData" @check-change="handleCheckChange"/>
  </div>
</template>

<script>
import TreeNode from './TreeNode.vue'

export default {
  components: {
    TreeNode
  },
  data() {
    return {
      treeData: [
        {
          id: 1,
          label: 'Root',
          expanded: true,
          children: [
            {
              id: 2,
              label: 'Child 1',
              children: []
            }
          ]
        }
      ]
    }
  },
  methods: {
    handleCheckChange(node) {
      console.log('Node checked:', node)
    }
  }
}
</script>

标签: vuetree
分享给朋友:

相关文章

vue实现文档

vue实现文档

Vue 实现文档的方法 在 Vue 中实现文档功能可以通过多种方式,包括使用富文本编辑器、Markdown 解析或直接渲染 HTML。以下是几种常见的实现方法。 使用富文本编辑器 富文本编辑器如 T…

vue实现多选联动

vue实现多选联动

vue实现多选联动的方法 使用v-model绑定数组 在Vue中,可以通过v-model绑定一个数组来实现多选联动。当复选框被选中或取消选中时,数组会自动更新。 <template>…

antd vue 实现

antd vue 实现

使用 Ant Design Vue 实现功能 Ant Design Vue 是基于 Vue.js 的 UI 组件库,提供了丰富的组件和设计规范。以下是一些常见功能的实现方法。 安装 Ant Desi…

vue实现slider

vue实现slider

Vue 实现 Slider 组件 使用 Vue 实现 Slider 组件可以通过原生开发或借助第三方库。以下是两种常见方法: 原生实现 Slider 创建一个基础的 Slider 组件,通过 v-m…

vue实现试卷

vue实现试卷

Vue实现试卷系统的基本思路 使用Vue.js构建试卷系统需要结合组件化开发、状态管理和后端数据交互。核心功能包括题目展示、答题逻辑、计时器和提交答案。 核心功能模块划分 试卷组件结构 试卷容器组…

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tabl…