当前位置:首页 > VUE

vue实现树形框

2026-01-17 16:52:32VUE

Vue 树形组件实现方法

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

递归组件是 Vue 中实现树形结构的常见方式。通过组件调用自身的方式展示嵌套数据。

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

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

数据格式示例:

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

添加展开/折叠功能

通过控制节点的 visible 属性实现展开折叠效果。

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

<script>
export default {
  methods: {
    toggle(item) {
      this.$set(item, 'expanded', !item.expanded)
    }
  }
}
</script>

添加复选框功能

通过维护选中状态实现多级复选框联动。

vue实现树形框

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

<script>
export default {
  methods: {
    handleCheckChange(item) {
      this.$emit('check-change', item)
    },
    onChildCheckChange(child) {
      const allChecked = this.treeData.every(item => item.checked)
      this.$emit('check-change', { ...this.treeData[0], checked: allChecked })
    }
  }
}
</script>

使用第三方库

对于复杂需求,可以考虑以下成熟的开源组件:

  • Element UI 的 Tree 组件
  • Vue Tree Select
  • Vue Draggable Tree

安装 Element UI Tree 示例:

npm install element-ui

使用示例:

vue实现树形框

<template>
  <el-tree
    :data="treeData"
    show-checkbox
    node-key="id"
    :props="defaultProps"
  ></el-tree>
</template>

<script>
import { Tree } from 'element-ui'

export default {
  components: {
    'el-tree': Tree
  },
  data() {
    return {
      treeData: [/* 数据 */],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  }
}
</script>

性能优化建议

大数据量情况下考虑虚拟滚动技术,只渲染可视区域内的节点。可以使用 vue-virtual-scroll-tree 等专门优化的库。

实现懒加载功能,当节点展开时才加载子节点数据:

async toggle(item) {
  if (!item.childrenLoaded && item.hasChildren) {
    item.children = await loadChildren(item.id)
    item.childrenLoaded = true
  }
  item.expanded = !item.expanded
}

自定义节点内容

通过作用域插槽实现高度自定义的节点渲染:

<el-tree :data="data">
  <template #default="{ node, data }">
    <span>{{ node.label }}</span>
    <span v-if="data.tag" class="tag">{{ data.tag }}</span>
  </template>
</el-tree>

标签: vue
分享给朋友:

相关文章

vue实现多个tab

vue实现多个tab

Vue 实现多个 Tab 的方法 使用动态组件切换 在 Vue 中可以通过动态组件 <component :is="currentTab"> 结合 v-for 和 v-bind 实现多个…

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成列…

vue实现自定义登录

vue实现自定义登录

实现自定义登录的基本步骤 在Vue中实现自定义登录功能通常需要结合前端和后端技术。以下是一个基本的实现流程: 创建登录表单组件 使用Vue的单文件组件创建一个登录表单,包含用户名和密码输入框以及提…

vue里实现增删改查

vue里实现增删改查

在Vue中实现增删改查 数据初始化 在Vue组件的data中定义初始数据和表单绑定的变量: data() { return { items: [ { id: 1, name:…

vue实现菜单栏锚点

vue实现菜单栏锚点

实现锚点菜单的基本思路 在Vue中实现菜单栏锚点功能,主要涉及两个方面:创建可跳转的锚点位置,以及菜单项的点击滚动控制。通过监听滚动事件可以高亮当前可见区域的对应菜单项。 创建页面锚点位置 在需要跳…

vue实现摘要

vue实现摘要

Vue 实现摘要的方法 在 Vue 中实现文本摘要功能通常涉及截取文本的前部分内容并添加省略号。可以通过计算属性、过滤器或自定义指令来实现。 计算属性实现 在 Vue 组件中定义一个计算属性,用于截…