当前位置:首页 > VUE

vue实现穿梭框树组件

2026-03-27 04:29:29VUE

Vue 穿梭框树组件实现

穿梭框树组件(Tree Transfer)结合了树形结构和穿梭框功能,常用于权限分配、数据分类等场景。以下是基于 Vue 2/3 的实现方案:

核心功能设计

  1. 数据结构
    树形数据需包含 id, label, children 等字段,例如:

    const treeData = [
      {
        id: 1,
        label: '一级节点',
        children: [
          { id: 4, label: '二级节点-1' },
          { id: 5, label: '二级节点-2' }
        ]
      }
    ]
  2. 组件拆分

    • 左侧源树(可勾选)
    • 右侧目标树(已选择项)
    • 中间操作按钮(移动、全选等)

基础实现步骤

1. 树形组件渲染
使用递归组件渲染树形结构,支持复选框勾选:

<template>
  <div class="tree-node" v-for="node in data" :key="node.id">
    <input 
      type="checkbox" 
      v-model="node.checked"
      @change="handleCheck(node)"
    >
    <span>{{ node.label }}</span>
    <tree-node 
      v-if="node.children" 
      :data="node.children"
      @check-change="handleChildCheck"
    />
  </div>
</template>

2. 穿梭逻辑
通过 checkedNodes 数组记录已选节点,点击按钮时移动数据:

methods: {
  transferToRight() {
    this.rightData = [...this.rightData, ...this.getCheckedNodes(this.leftData)];
    this.clearChecked(this.leftData);
  }
}

3. 父子联动
实现勾选父节点时自动选中所有子节点:

vue实现穿梭框树组件

function toggleChildren(node, checked) {
  if (node.children) {
    node.children.forEach(child => {
      child.checked = checked;
      this.toggleChildren(child, checked);
    });
  }
}

进阶优化方案

虚拟滚动支持
对大数据量使用虚拟滚动优化性能:

<virtual-list 
  :size="50" 
  :remain="8" 
  :data="flattenTreeData"
>
  <template v-slot="{ item }">
    <!-- 树节点渲染 -->
  </template>
</virtual-list>

懒加载支持
异步加载子节点数据:

async function loadChildren(node) {
  if (!node.childrenLoaded) {
    const res = await api.getChildren(node.id);
    node.children = res.data;
    node.childrenLoaded = true;
  }
}

拖拽排序
添加 draggable 属性实现节点拖拽:

vue实现穿梭框树组件

<div 
  draggable 
  @dragstart="handleDragStart(node)"
  @drop="handleDrop(targetNode)"
>

完整示例代码

查看 CodeSandbox 示例
包含以下功能:

  • 双向数据绑定
  • 搜索过滤
  • 自定义图标
  • 多级联动选择

第三方库推荐

  1. Vue-Element-Tree
    基于 ElementUI 的树形穿梭框,支持大量现成功能。

  2. Vue-Treeselect
    提供树形选择+穿梭框的混合组件,适合复杂场景。

  3. Vue-Draggable-Nested-Tree
    支持拖拽排序的树形组件,可自行扩展穿梭功能。

实现时需根据项目需求选择合适方案,注意性能优化和可访问性设计。

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

相关文章

vue实现引导

vue实现引导

Vue 实现引导功能的方法 使用第三方库 推荐使用 driver.js 或 intro.js 这类专门为 Vue 设计的引导库。这些库提供了完整的 API 和样式,能够快速实现引导功能。 安装 dr…

vue 组件实现

vue 组件实现

Vue 组件实现方法 单文件组件 (SFC) 使用 .vue 文件格式,包含模板、脚本和样式三部分: <template> <div class="example">{{…

vue实现数组

vue实现数组

Vue 实现数组操作的方法 在 Vue 中,数组的操作需要特别注意响应式的问题。Vue 提供了一些方法来确保数组的变动能够触发视图更新。 响应式数组方法 Vue 对以下数组方法进行了封装,确保它们能…

vue mvvm 实现

vue mvvm 实现

Vue MVVM 实现原理 Vue.js 的 MVVM(Model-View-ViewModel)架构通过数据绑定和响应式系统实现视图与数据的自动同步。以下是其核心实现机制: 数据劫持与响应式系统…

vue ui实现创建vue项目

vue ui实现创建vue项目

使用 Vue UI 创建 Vue 项目 Vue UI 是 Vue CLI 提供的图形化界面工具,可以通过可视化操作创建和管理 Vue 项目。 安装 Vue CLI 确保已安装 Node.js(建议版…

vue实现word在线

vue实现word在线

Vue 实现 Word 在线编辑与预览 方案一:使用 docx.js 与前端解析 安装依赖库 docx 和 file-saver,用于生成和下载 Word 文件: npm install docx…