当前位置:首页 > 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>

添加复选框功能

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

<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

使用示例:

<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
}

自定义节点内容

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

vue实现树形框

<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实现防抖节流

vue实现防抖节流

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

vue实现文章锚点定位

vue实现文章锚点定位

实现文章锚点定位的方法 在Vue中实现文章锚点定位可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML锚点 通过HTML的id属性和<a>标签的href属性实现锚点跳转。在Vu…

vue实现节流

vue实现节流

vue实现节流的方法 在Vue中实现节流(throttle)功能,通常用于限制高频事件的触发频率,例如滚动、输入或按钮点击。以下是几种常见的实现方式: 使用Lodash的throttle函数 安装L…

vue实现ppt

vue实现ppt

Vue 实现 PPT 的功能 Vue 可以结合第三方库或自定义组件实现类似 PPT 的演示效果。以下是几种常见的方法: 使用第三方库 reveal.js reveal.js 是一个流行的演示框架,支…

vue实现tabbar

vue实现tabbar

Vue 实现 TabBar 的方法 使用 Vue Router 实现基础 TabBar 安装 Vue Router 依赖: npm install vue-router 创建路由配置文件(route…

vue工序实现

vue工序实现

Vue 工序实现方法 在Vue中实现工序(或流程)功能,通常涉及状态管理、组件通信和动态渲染。以下是几种常见方法: 使用动态组件 通过Vue的<component :is="currentCo…