tree组件需要的数据结构(用来实现数据权限)

1 篇文章 0 订阅

后台返回的数据 渲染成tree组件需要的数据结构(用来实现数据权限)

第一步 明确我们要做什么,下面的图片就是我们需要做的。

在这里插入图片描述

第二步处理数据 上图片三张图片分别是后台返回的数据

1.第一张图片的数据为一级菜单的权限
2.第二张图片的数据为二级菜单的权限
3.第三张图片的数据为按钮和链接的权限
4.后台的数据有了 现在就是要把这些数据组合成我们所需要的数据。
5.第四张图片就是怎么把这些所有的数组通过递归的方式组合成一个我们所需要的数组
6.第五张图片就是我们最终处理完所需要的数据结构

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第三步 数据我们有了 去组件里面复制这个组件 拿到自己的项目中 通过下面两段代码实现tree权限树的渲染(无论是Vue还是React数据的结构都是一样的)

//一二三级数据
  const renderTree = (data) => {
    return data.map(item => {
      if (!item.children) {
        return (
          <TreeNode title={item.title} key={item.key} ></TreeNode>
        )
      } else {
        return <TreeNode title={item.title} key={item.key} >
          {renderTree(item.children)}
        </TreeNode>
      }
    })
  }
{menu.length > 0 &&
          <Tree
            checkable
            onSelect={onSelect}
            onCheck={onCheck}
            defaultExpandAll={true}
            checkedKeys={checkedKeys} //默认选中的复选框
            autoExpandParent={true}//是否自动展开父节点
            checkStrictly    //就是这个属性
          >
            {renderTree(menu)}
          </Tree>
        }

最后贴出所有代码 希望你喜欢

//权限管理
import React, { useEffect, useState } from 'react';
import { Card, Radio, Tree, Button, notification } from 'antd';
import PageHeaderWrapper from '@/components/PageHeaderWrapper';
import { PageHeaderProps } from '@/utils/untils';
import { grantPermissionInit, grantRolePermission } from '@/services/permissionService'
import ShuttleBox from './ShuttleBox'
const TreeNode = Tree.TreeNode
const Permissions: React.FC = (props: any) => {
  const { id, pid, roleLevel, roleName } = props.history.location.state.record
  const [menu, setMenu] = useState([])
  const [checkedKeys, setCheckedKeys] = useState([])
  const [radio, setRadio] = useState(1)
  useEffect(() => {
    grantPermissionInit({ id, pid, roleLevel }).then(res => {
      if (res.code === '0') {
        const { firstMenus, secondMenus, buttons } = res.data
        const data = handleData(firstMenus, secondMenus, buttons)
        console.log(data,'datatdatda')
        setMenu(data)
        console.log(data, 'data......')
        const keys = mapCheckedKeys(data)
        setCheckedKeys(keys)
      }
    })
  }, [])

  // 处理权限列表数据
  const handleData = (firstMenu, secondMenu, buttons) => {
    const thirdMenu = buttons.filter(item => item.id.toString().length === 5)
    const forthMenu = buttons.filter(item => item.id.toString().length === 6)

    const handleMenu = (parentMenu, childMenu) => {
      parentMenu.forEach(parent => {
        parent.children = []
        parent.title = parent.resourceName
        parent.key = parent.id.toString()
        childMenu.forEach(child => {
          if (child.pid === parent.id) {
            parent.children.push({ ...child, children: child.children || [], title: child.resourceName, key: child.id.toString() })
          }
        })
      })
    }
    handleMenu(thirdMenu, forthMenu)
    handleMenu(secondMenu, thirdMenu)
    handleMenu(firstMenu, secondMenu)
    return firstMenu
  }

  //一二三级数据
  const renderTree = (data) => {
    return data.map(item => {
      if (!item.children) {
        return (
          <TreeNode title={item.title} key={item.key} ></TreeNode>
        )
      } else {
        return <TreeNode title={item.title} key={item.key} >
          {renderTree(item.children)}
        </TreeNode>
      }
    })
  }
 
  const onCheck = (allCheckedKeys: any, info: any) => {
    console.log('onCheck', allCheckedKeys, info);
    if (allCheckedKeys.checked) {
      let result = []
      allCheckedKeys.checked.forEach(item => {
        if (item.toString().length === 3) {
          result.push(item)
        }
        if (item.toString().length === 4) {
          result.push(item.toString().slice(0, 3), item)
        }
        if (item.toString().length === 5) {
          result.push(item.toString().slice(0, 3), item.toString().slice(0, 4), item)
        }
        if (item.toString().length === 6) {
          result.push(item.toString().slice(0, 3), item.toString().slice(0, 4), item.toString().slice(0, 5), item)
        }
      })
      let arr = Array.from(new Set(result))
      setCheckedKeys(arr)
    }

  };
  const grantRole = () => {
    let data = {
      permissionIds: checkedKeys,
      roleId: id,
      roleName
    }
    grantRolePermission(data).then(res => {
      if (res.code === '0') {
        props.history.goBack()
        notification.success({ message: '权限配置成功' })
      }
    })
  }

  const getLength = (arr) => {
    let length = 0;
    length += arr.length;
    arr.forEach(item => {
      length += getLength(item.children || [])
    })
    return length;
  }
  //获取所有返回数据选中的key值
  const mapCheckedKeys = (arr) => {
    let result = [];
    arr.forEach((item) => {
      let isHalf = false;
      if (item.children) {
        const filteredChildrenKeys = mapCheckedKeys(item.children);
        isHalf = filteredChildrenKeys.length !== getLength(item.children);
        result = result.concat(filteredChildrenKeys);
      }
      if (item.checked === "checked") {
        result.push(item.key);
      }
    });
    return result;
  };
 
 
  return (
    <PageHeaderWrapper {...PageHeaderProps}>
      <Card title="权限配置类型" bordered={false} style={{ width: '100%' }}>
        <Radio.Group onChange={onChange} value={radio}>
          <Radio defaultChecked={true} value={1}>
            功能权限
          </Radio>
          <Radio defaultChecked={true} value={2}>
            车型权限
          </Radio>
        </Radio.Group>

      </Card>
      {radio === 1 && <Card title={''} size="small">
        {menu.length > 0 &&
          <Tree
            checkable
            onSelect={onSelect}
            onCheck={onCheck}
            defaultExpandAll={true}
            checkedKeys={checkedKeys} //默认选中的复选框
            autoExpandParent={true}//是否自动展开父节点
            checkStrictly    //就是这个属性
          >
            {renderTree(menu)}
          </Tree>
        }
        <div style={{ float: 'right' }}>
          <Button type="primary" size="small" onClick={grantRole}>确定</Button>
          <Button size="small" style={{ marginLeft: "30px" }} onClick={() => { props.history.goBack() }}>取消</Button>
        </div>
      </Card>}
     
    </PageHeaderWrapper>
  );
};
export default Permissions;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

呵呵的牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值