在vue中封装构造树形结构方法,选中树形结构复选框,获取选中的id及半选中的id

需求:

需要给用户分配菜单权限,源菜单是扁平化数组,需要将数组转化为树形结构,选中节点复选框,获取该节点的id及半选中的id

首先,封装树形结构方法

我们可以在utils中新建一个tree.js的文件,在该文件中封装一个构造树形结构的方法
例如:

/**
 * 构造树型结构数据
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 */
export function handleTree(data, id, parentId, children) {
  let config = {
    id: id || 'id',
    parentId: parentId || 'parentId',
    childrenList: children || 'children'
  };

  var childrenListMap = {};
  var nodeIds = {};
  var tree = [];

  for (let d of data) {
    let parentId = d[config.parentId];
    if (childrenListMap[parentId] == null) {
      childrenListMap[parentId] = [];
    }
    nodeIds[d[config.id]] = d;
    childrenListMap[parentId].push(d);
  }

  for (let d of data) {
    let parentId = d[config.parentId];
    if (nodeIds[parentId] == null) {
      tree.push(d);
    }
  }

  for (let t of tree) {
    adaptToChildrenList(t);
  }

  function adaptToChildrenList(o) {
    if (childrenListMap[o[config.id]] !== null) {
      o[config.childrenList] = childrenListMap[o[config.id]];
    }
    if (o[config.childrenList]) {
      for (let c of o[config.childrenList]) {
        adaptToChildrenList(c);
      }
    }
  }
  return tree;
}

使用方法:可以将此方法全局挂载

import { handleTree } from "@/utils/tree";
//全局方法挂载
Vue.prototype.handleTree = handleTree
//此时我们就可以通过this.handleTree的方法将扁平化数组构造成二维数组了
//假设menuList是从后端获取到的扁平化数组
 this.menuList = JSON.parse(
          JSON.stringify(res.data.menus).replace(/menuName/g, "label")
        );//此方法是为了将menuName通过正则的方式,改变属性名为label,这样是为了转为树形结构的时候,节点展示的内容为menuName
this.menuList = this.handleTree(this.menuList, "menuId");//将menuList造成树形结构数据

此时打印menuList就是转换为树形结构数据了
在这里插入图片描述

然后通过el-tree组件实现页面UI效果

    <el-tree
          :data="menuList"
          show-checkbox
          node-key="menuId"
          :props="defaultProps"
          :default-expand-all="false"
          ref="dept"
          class="tree-border"
          accordion
        >
//参数说明如下图
 defaultProps: {
        children: "children",
        label: "label",
      },

在这里插入图片描述

当我们勾选源菜单的内容时,页面都会有添加到目标菜单按钮,此时这个按钮需要触发一个事件

    // 所有部门节点数据
    getDeptAllCheckedKeys() {
      // 目前被选中的部门节点
      let checkedKeys = this.$refs.dept.getCheckedKeys();
      // 半选中的菜单节点
      let halfCheckedKeys = this.$refs.dept.getHalfCheckedKeys();
      checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
      console.log("checkedKeys", checkedKeys);
      return checkedKeys;
    },
    //源表格添加到右侧表格
    pushRight() {
      this.$confirm("是否给该用户配置勾选的菜单?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          //勾选中及半选中的所有菜单节点的id数组,此时就可以把这个传给后端了
          this.form.menuIds = this.getDeptAllCheckedKeys();
          addTenantMenu({
            menuIds: this.form.menuIds,
          }).then(() => {
            this.$message({
              showClose: true,
              message: "恭喜您,配置菜单成功!",
              type: "success",
            });
            this.chooseChange(this.platformId);//重新发起get请求,获取改动后的内容
          });
        })
        .catch(() => {
          this.$message({
            type: "info",
            message: "配置取消!",
          });
        });
    },

到这里,我们就完成了将后端返回的扁平化数组转化为树形结构,并且通过el-tree组件来实现页面的UI树形效果,并且节点带有复选框,勾选复选框时获取勾选中及半选中的所有id

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
回答: 在Vue项目,组织架构可以通过封装API接口来获取数据,并进行树形处理。首先,需要在src/views/departments/index.vue文件引入组织架构模块的组件TreeTools。然后,在该文件可以使用el-tree组件来展示组织架构的内容。可以通过设置el-tree的data属性来传入组织架构的数据,通过设置defaultProps属性来指定显示内容的属性。同时,可以使用作用域插槽来循环展示每个节点的数据,并在插槽引入TreeTools组件来实现对节点的操作。\[3\] 在获取组织架构数据时,可以封装API接口来获取数据。可以在src/views/departments/index.vue文件定义一个data属性来存储组织架构的数据。可以通过调用API接口来获取数据,并将获取到的数据赋值给data属性的departs。\[3\] 在进行树形处理时,可以将获取到的数据转化成树形结构。可以在src/views/departments/index.vue文件定义一个方法来实现将数组数据转化成树形结构的功能。可以通过遍历数组数据,根据节点的父子关系来构建树形结构。\[1\] 综上所述,在Vue项目,可以通过封装API接口来获取组织架构数据,并通过树形处理将数据转化成树形结构,然后在组织架构模块引入相应的组件来展示和操作组织架构的内容。 #### 引用[.reference_title] - *1* *2* *3* [Vue项目实战之人力资源平台系统(五)组织架构模块](https://blog.csdn.net/qq_40652101/article/details/126836202)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多看书少吃饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值