<el-tree>标签使用

简介

el-tree 标签是 Element UI 提供的树形控件组件,可以用于一些树形结构数据的展示。

本文介绍如何结合后端接口,使用该空间完成一些展示/选中逻辑。

查询数据

如下,后端接口返回了下面这样结构的数据,是一个 部门-用户列表 的结构。

如下,将接口返回数据与组件展示的数据进行绑定,在 props 中对数据结构进行解析。

html 复制代码
<template>
  <div>
    <el-tree
        :data="treeData"
        :props="props"
        show-checkbox>
    </el-tree>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  data() {
    return {
      props: {
        label: function (node) {
          // 如果有 userVOList 属性,说明是部门节点,使用 departmentName
          // 如果没有 userVOList 属性,说明是用户节点,使用 userName
          return node.userVOList ? node.departmentName : node.userName;
        },
        children: 'userVOList'
      },
      treeData: []
    };
  },

  mounted() {
    this.loadTreeData();
  },
  /**
   * 调用后端接口
   */
  methods: {
    loadTreeData() {
      axios.post('http://localhost:8080/departments')
          .then(response => {
            if (response.data.status === 'success') {
              this.treeData = response.data.data;
            }
          })
          .catch(error => {
            console.error('加载数据失败:', error);
          });
    }
  }
};
</script>

启动项目,此时前端展示的数据就是后端返回的。

选中提交

要求选中某些用户,点击确定时,将选中的用户 userId 集合传递给后端,做某些操作,这是一个很常见的场景。

前端代码修改成如下。

html 复制代码
<template>
  <div>
    <!-- 确认 -->
    <el-button type="success" @click="openDialog" style="margin-bottom: 10px;">
      确认选择
    </el-button>

    <!-- 数据 -->
    <el-tree
        ref="tree"
        :props="props"
        :data="treeData"
        show-checkbox
        style="width: 300px;">
    </el-tree>

    <!-- 确认对话框 -->
    <el-dialog
        title="确认选择"
        v-model="dialogVisible"
        width="500px">
      <span>确定要提交选中的用户吗?</span>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="handleCancel">取消</el-button>
          <el-button type="primary" @click="handleConfirm">确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  data() {
    return {
      props: {
        label: function (node) {
          // 如果有 userVOList 属性,说明是部门节点,使用 departmentName
          // 如果没有 userVOList 属性,说明是用户节点,使用 userName
          return node.userVOList ? node.departmentName : node.userName;
        },
        children: 'userVOList'
      },
      treeData: [],
      dialogVisible: false,
      selectedUserIds: []
    };
  },
  mounted() {
    this.loadTreeData();
  },
  methods: {
    /**
     * 加载部门和用户数据到树结构
     */
    loadTreeData() {
      axios.post('http://localhost:8080/departments')
          .then(response => {
            if (response.data.status === 'success') {
              this.treeData = response.data.data;
            }
          })
          .catch(error => {
            console.error('加载数据失败:', error);
          });
    },

    /**
     * 打开确认对话框
     */
    openDialog() {
      this.dialogVisible = true;
    },

    /**
     * 处理确认提交选中的用户ID
     */
    handleConfirm() {
      // 获取选中的节点
      const checkedNodes = this.$refs.tree.getCheckedNodes(true);

      // 过滤出用户节点(没有userVOList属性的节点)
      this.selectedUserIds = checkedNodes
          .filter(node => !node.userVOList)
          .map(node => node.userId);

      // 调用后端接口
      this.uploadUsers();

      // 关闭对话框
      this.dialogVisible = false;
    },

    /**
     * 处理取消提交选中的用户ID
     */
    handleCancel() {
      this.dialogVisible = false;
    },

    /**
     * 提交选中的用户ID到后端
     */
    uploadUsers() {
      // 调用后端接口
      axios.post('http://localhost:8080/uploadUsers', {
        userIds: this.selectedUserIds
      })
          .then(response => {
            console.log('接口调用成功:', response.data);
            this.$message.success('提交成功');
          })
          .catch(error => {
            console.error('接口调用失败:', error);
            this.$message.error('提交失败');
          });
    }
  }
};
</script>

启动项目,选中某些用户,点击 确认选择,可见调用接口时,将选中的用户 ID 放到集合中作为参数传递了。

相关推荐
不听话坏4 小时前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
likeyi074 小时前
require 和 import的区别
开发语言·前端
pany5 小时前
做 AI 友好的开源 Vue3 模板 🌈
前端·vue.js·ai编程
小二·5 小时前
React 19 + Next.js 15 现代前端开发实战:App Router / Server Components / 流式渲染
前端·javascript·react.js
daols886 小时前
vue 甘特图 vxe-gantt 小时视图设置日期轴每间隔 3 个小时
vue.js·甘特图·vxe-gantt
谙忆10246 小时前
前端图片直传对象存储:OSS/S3 预签名 URL、STS 临时凭证与回调校验
前端
CHNE_TAO_EMSM7 小时前
Android studio 打开文件时自动下载源码
前端·javascript·android studio
一孤程8 小时前
Airtest自动化测试第五篇:小程序与Web测试——跨平台自动化全覆盖
前端·自动化测试·小程序·自动化·测试·airtest
IT_陈寒8 小时前
SpringBoot自动配置不是你以为的那样的智能
前端·人工智能·后端
yume_sibai9 小时前
大屏数据可视化 - 边框红绿呼吸灯实现详解
前端·信息可视化·typescript