当前位置:首页 > VUE

vue实现树形控件

2026-02-20 06:15:57VUE

Vue 实现树形控件的方法

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

递归组件是 Vue 中实现树形结构的核心方法。通过组件调用自身,可以动态渲染嵌套的树节点数据。

<template>
  <div class="tree-node">
    <div @click="toggle">{{ node.name }}</div>
    <div v-show="isOpen" v-if="node.children">
      <tree-node 
        v-for="child in node.children" 
        :key="child.id" 
        :node="child"
      />
    </div>
  </div>
</template>

<script>
export default {
  name: 'TreeNode',
  props: {
    node: Object
  },
  data() {
    return {
      isOpen: false
    }
  },
  methods: {
    toggle() {
      this.isOpen = !this.isOpen
    }
  }
}
</script>

使用第三方组件库快速实现

Element UI、Ant Design Vue 等流行 UI 库都提供了成熟的树形控件实现。

安装 Element UI:

npm install element-ui

使用示例:

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

<script>
export default {
  data() {
    return {
      treeData: [{
        label: '一级节点',
        children: [{
          label: '二级节点'
        }]
      }],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  },
  methods: {
    handleNodeClick(data) {
      console.log(data)
    }
  }
}
</script>

实现可拖拽的树形结构

通过引入拖拽库实现节点拖拽排序功能。

vue实现树形控件

使用 sortablejs 实现:

npm install sortablejs

实现代码:

<template>
  <div ref="tree">
    <tree-node 
      v-for="node in treeData" 
      :key="node.id" 
      :node="node"
    />
  </div>
</template>

<script>
import Sortable from 'sortablejs'
export default {
  mounted() {
    this.setSortable()
  },
  methods: {
    setSortable() {
      new Sortable(this.$refs.tree, {
        handle: '.drag-handle',
        animation: 150,
        onEnd: this.onSortEnd
      })
    },
    onSortEnd(evt) {
      // 处理排序后的数据更新
    }
  }
}
</script>

实现树节点的增删改查功能

为树形控件添加完整的 CRUD 操作功能。

vue实现树形控件

<template>
  <div>
    <el-tree
      ref="tree"
      :data="treeData"
      node-key="id"
      default-expand-all
    />
    <el-button @click="addNode">添加节点</el-button>
    <el-button @click="removeNode">删除节点</el-button>
  </div>
</template>

<script>
export default {
  methods: {
    addNode() {
      const newNode = { id: Date.now(), label: '新节点' }
      this.$refs.tree.append(newNode, this.$refs.tree.getCurrentNode())
    },
    removeNode() {
      this.$refs.tree.remove(this.$refs.tree.getCurrentNode())
    }
  }
}
</script>

实现树节点的懒加载

对于大数据量的树形结构,实现按需加载子节点。

<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: '根节点' }])
      }
      if (node.level > 3) {
        // 设置叶子节点
        return resolve([])
      }
      // 模拟异步加载
      setTimeout(() => {
        resolve([{
          name: '子节点' + node.level
        }])
      }, 500)
    }
  }
}
</script>

实现树形表格

结合表格展示树形数据,实现更复杂的数据展示需求。

<template>
  <el-table
    :data="tableData"
    row-key="id"
    default-expand-all
    :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
  >
    <el-table-column prop="date" label="日期"></el-table-column>
    <el-table-column prop="name" label="名称"></el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [{
        id: 1,
        date: '2023-01-01',
        name: '一级',
        children: [{
          id: 2,
          date: '2023-01-02',
          name: '二级'
        }]
      }]
    }
  }
}
</script>

实现树形选择器

将树形结构封装为选择器组件,方便表单使用。

<template>
  <el-popover
    ref="popover"
    placement="bottom-start"
    trigger="click"
  >
    <el-tree
      :data="treeData"
      :props="defaultProps"
      @node-click="handleNodeClick"
    />
    <el-input
      slot="reference"
      v-model="selectedLabel"
      readonly
      placeholder="请选择"
    />
  </el-popover>
</template>

<script>
export default {
  data() {
    return {
      selectedLabel: '',
      treeData: [/* 树数据 */],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  },
  methods: {
    handleNodeClick(data) {
      this.selectedLabel = data.label
      this.$refs.popover.doClose()
    }
  }
}
</script>

标签: 控件vue
分享给朋友:

相关文章

vue原理实现

vue原理实现

Vue 原理实现的核心机制 Vue.js 的核心原理基于响应式系统、虚拟 DOM 和模板编译。以下是其核心实现机制的分解: 响应式系统 Vue 使用 Object.defineProperty(Vu…

vue实现换页

vue实现换页

Vue实现页面切换的方法 在Vue中实现页面切换通常可以通过Vue Router来完成。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。以下是几种常见的实现方式:…

vue实现滚动显示

vue实现滚动显示

Vue 实现滚动显示的几种方法 在 Vue 中实现滚动显示可以通过多种方式实现,以下是几种常见的方法: 使用 CSS 动画 通过 CSS 的 animation 属性结合 @keyframes 实现…

vue打包实现推送

vue打包实现推送

Vue 项目打包与自动化部署推送 打包 Vue 项目 使用以下命令生成生产环境代码,默认输出到 dist 目录: npm run build 配置自动化推送(以 GitHub Pages 为例)…

vue实现左右菜单

vue实现左右菜单

实现左右菜单的基本思路 使用Vue实现左右菜单通常需要两个主要组件:左侧的导航菜单和右侧的内容区域。左侧菜单用于导航,右侧区域根据菜单选择动态展示内容。 创建左侧菜单组件 左侧菜单通常是一个列表,可…

vue实现点击提交

vue实现点击提交

Vue 实现点击提交功能 在 Vue 中实现点击提交功能通常涉及表单处理和事件绑定。以下是几种常见的实现方式: 使用 v-on 或 @ 绑定点击事件 通过 v-on:click 或简写 @click…