当前位置:首页 > 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组件可识别的平面数据结构。

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样式改善显示效果,确保树形结构和穿梭框布局协调。需要特别注意高度控制和滚动条处理。

.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方法实现按需加载。

vue实现树穿梭

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中,可以通过结合DOM操作、Canvas绘制及第三方库实现。以下是具体方法: 使用html2canvas库实现 安装…

vue实现主题

vue实现主题

Vue 实现主题的方法 使用 CSS 变量动态切换主题 定义全局 CSS 变量,通过修改这些变量实现主题切换。在 Vue 的根组件或全局样式中定义变量: :root { --primary-co…

vue实现主页

vue实现主页

Vue 实现主页的基本步骤 创建一个 Vue 主页通常涉及以下几个关键步骤,从项目初始化到页面布局和功能实现。 初始化 Vue 项目 使用 Vue CLI 或 Vite 初始化项目。Vue CLI…

vue实现拍照

vue实现拍照

Vue实现拍照功能 在Vue中实现拍照功能通常需要结合浏览器的MediaDevices API和Canvas元素。以下是具体实现方法: 安装依赖(可选) 如果需要更简单的封装,可以安装vue-web…

vue实现hovuer

vue实现hovuer

Vue 实现 Hover 效果 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 直接控制 通过 :hover 伪类实现,无需额外的 JavaScrip…

vue实现京东

vue实现京东

Vue 实现京东电商网站的关键步骤 项目搭建与基础配置 使用 Vue CLI 或 Vite 初始化项目,安装 Vue Router 管理路由,Vuex/Pinia 管理状态。配置基础 UI 框架如 E…