当前位置:首页 > VUE

vue实现树穿梭

2026-02-09 12:20:27VUE

Vue实现树形穿梭框方案

使用Element UI的Tree和Transfer组件结合实现树形穿梭功能。需要安装Element UI库,版本建议2.15.x以上。

npm install element-ui -S

基础组件结构

在Vue文件中引入必要组件并构建基础模板结构。需要同时使用el-tree和el-transfer组件,通过自定义渲染实现树形展示。

<template>
  <div class="tree-transfer">
    <el-transfer
      v-model="selectedKeys"
      :data="transferData"
      :titles="['源数据', '已选择']"
      :props="{ key: 'id', label: 'label' }"
      :left-default-checked="leftChecked"
      :right-default-checked="rightChecked">
      <template #left-footer>
        <el-tree
          ref="sourceTree"
          :data="treeData"
          show-checkbox
          node-key="id"
          :props="treeProps"
          @check-change="handleCheckChange">
        </el-tree>
      </template>
    </el-transfer>
  </div>
</template>

数据处理逻辑

准备树形数据和平面化处理,确保穿梭框能正确显示树形结构。需要将树形数据转换为Transfer组件可识别的平面数据结构。

vue实现树穿梭

export default {
  data() {
    return {
      treeData: [
        {
          id: 1,
          label: '一级节点',
          children: [
            { id: 4, label: '二级节点-1' },
            { id: 5, label: '二级节点-2' }
          ]
        }
      ],
      transferData: [],
      selectedKeys: [],
      leftChecked: [],
      rightChecked: [],
      treeProps: {
        label: 'label',
        children: 'children'
      }
    }
  },
  methods: {
    flattenTree(tree, arr = []) {
      tree.forEach(node => {
        arr.push({ id: node.id, label: node.label })
        if (node.children) {
          this.flattenTree(node.children, arr)
        }
      })
      return arr
    }
  },
  mounted() {
    this.transferData = this.flattenTree(this.treeData)
  }
}

选中状态同步

处理Tree组件和Transfer组件之间的选中状态同步。当树节点被勾选时,需要更新Transfer组件的选中状态。

methods: {
  handleCheckChange(node, checked) {
    const checkedKeys = this.$refs.sourceTree.getCheckedKeys()
    this.leftChecked = checkedKeys.filter(key => !this.selectedKeys.includes(key))

    if (checked) {
      if (!this.selectedKeys.includes(node.id)) {
        this.selectedKeys.push(node.id)
      }
    } else {
      this.selectedKeys = this.selectedKeys.filter(key => key !== node.id)
    }
  }
}

样式优化

添加CSS样式改善显示效果,确保树形结构和穿梭框布局协调。需要特别注意高度控制和滚动条处理。

vue实现树穿梭

.tree-transfer {
  display: flex;
  justify-content: center;
}

.el-transfer {
  width: 800px;
}

.el-tree {
  height: 400px;
  overflow: auto;
  margin-top: 10px;
}

完整组件封装

将上述逻辑封装为可复用的TreeTransfer组件,支持自定义节点渲染和外部数据绑定。

export default {
  props: {
    data: {
      type: Array,
      required: true
    },
    value: {
      type: Array,
      default: () => []
    }
  },
  watch: {
    value(newVal) {
      this.selectedKeys = [...newVal]
    },
    selectedKeys(newVal) {
      this.$emit('input', [...newVal])
    }
  }
}

性能优化建议

对于大型树结构,建议采用懒加载和虚拟滚动技术。可以使用Element UI的lazy属性配合load方法实现按需加载。

async loadNode(node, resolve) {
  if (node.level === 0) {
    return resolve([{ id: 1, label: '根节点' }])
  }
  if (node.level >= 3) return resolve([])

  const { data } = await api.getChildren(node.id)
  resolve(data)
}

标签: vue
分享给朋友:

相关文章

vue拖拽实现

vue拖拽实现

Vue 拖拽实现方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop 事…

vue实现 页面

vue实现 页面

Vue 实现页面的核心方法 创建 Vue 项目 使用 Vue CLI 或 Vite 快速初始化项目。Vue CLI 是官方脚手架工具,适合传统项目;Vite 提供更快的现代构建体验。 npm cre…

vue 实现vshow

vue 实现vshow

Vue 实现 v-show 在 Vue 中,v-show 是一个常用的指令,用于根据条件控制元素的显示或隐藏。与 v-if 不同,v-show 不会移除 DOM 元素,而是通过 CSS 的 displ…

vue实现选择框

vue实现选择框

Vue 实现选择框的方法 Vue 中可以通过多种方式实现选择框(下拉框),包括原生 HTML 的 <select> 元素结合 Vue 的数据绑定,或者使用第三方 UI 库如 Element…

vue实现数据删除

vue实现数据删除

vue实现数据删除的方法 使用v-for和v-on指令 在Vue中可以通过v-for指令渲染列表数据,结合v-on指令监听删除事件。定义一个方法处理删除逻辑,通常使用splice方法从数组中移除指定项…

vue实现切换隐藏

vue实现切换隐藏

使用 v-show 指令实现切换隐藏 在 Vue 中,v-show 是最简单的切换元素显示/隐藏的方法。它通过 CSS 的 display 属性控制元素可见性。 <template>…