react 权限树形结构实现

项目背景 react + ant design

实现效果

1 将后台返回的平铺数据 , 转成树形结构

javascript 复制代码
 const [roleId, setRoleId] = useState('') //存储角色id

  // 弹权限弹窗
  const empowerHandle = async record => {
    setRoleId(record.roleId)
    //获取单独的权限
    const res1 = await getPermission({ roleId: record.roleId })
    console.log('res1', res1)

    const res2 = await getSimple()
    console.log('res2', res2)

    //平铺数据转树形结构
    function buildTree (data, parentId = 0) {
      let tree = [] // 用于存放结果的数组

      // 遍历数据,找到parentId匹配的项
      for (let item of data) {
        if (item.parentId === parentId) {
          // 创建一个新对象,准备添加子节点
          let node = { ...item, children: buildTree(data, item.permissionId) } // 递归调用,处理子节点
          tree.push(node) // 将当前节点添加到结果数组中
        }
      }

      return tree
    }
    // title替换permissionName,让树形结构内容可以展示出来
    const res3 = res2.map(item => {
      return {
        ...item,
        title: item.permissionName,
        key: item.permissionId
      }
    })

    const result1 = buildTree(res1, 0) // 获取单独的权限

    console.log('res1111111', result1)

    // 获取res1中的permissionId作为已选中的Id列表
    const selectedIds = res1.map(item => item.permissionId)
    console.log('selectedIds', selectedIds)

    // 构建treeData时同时处理选中状态
    const result = buildTree(res3, 0)
    console.log('3333333333333', result)

    setTreeData(result)
    setcheckedKeys(selectedIds)

    setempower(true)
  }

2 拿到角色id并传递到tree中

javascript 复制代码
  // 获取选中的权限,为了修改权限
  const ontreeCheck = checkedKeysValue => {
    console.log('onCheck', checkedKeysValue.checked) // 这里可以拿到选中的所有的权限id
    setcheckedKeys(checkedKeysValue.checked)
  }

  // 修改权限提交
  const treesubmit = async () => {
    const res1 = await getEditPermission({
      roleId: roleId,
      permissionIds: checkedKeys
    })
    setempower(false)
  }


    <Tree
                checkable
                checkedKeys={checkedKeys}
                defaultExpandAll={false} //让授权后的弹窗只展示根标签
                treeData={treeData}
                // multiple // 支持多选。当父子不关联,添加后,点击父,不能控制所有子
                // showLine //删除这里,树形结构左侧的下拉线消失,图标从+-更改为默认的△
                checkStrictly // 开启后,父子节点不关联(子空一个,父就空)
                onCheck={ontreeCheck}
              />



  const [treeData, setTreeData] = useState([
    {
      title: '0-1',
      key: '0-1',
      children: [
        {
          title: '0-1-0-0',
          key: '0-1-0-0'
        },
        {
          title: '0-1-0-1',
          key: '0-1-0-1'
        },
        {
          title: '0-1-0-2',
          key: '0-1-0-2'
        }
      ]
    },
    {
      title: '0-2',
      key: '0-2'
    }
  ])
相关推荐
Frag0ut3 分钟前
Chrome与Chromium内核浏览器在Windows 11上的新特性全景解析
前端·chrome·windows·web安全·chromium·gemini ai·playready drm
hiahiahia12337 分钟前
实现完整 Tool Dispatcher
开发语言·前端
IT_陈寒1 小时前
Java线程池这破玩意,差点让我周末加班排查到凌晨
前端·人工智能·后端
Mr_Mao1 小时前
告别选型困难!集 VueUse、ahooks、Mantine 于一身:286 个 Hook 的 ReaUse 来了
前端·javascript·react.js
智鸟科技GemeOpen开发者智能设备2 小时前
智能插座二次开发如何接入Home Assistant,从零开始完整工程实现(Python+React)
开发语言·python·物联网·react.js·智能家居
泡海椒2 小时前
趋势分析报表:jquick-pdf折线图PDF生成实战
java·大数据·运维·服务器·前端·pdf
默_笙2 小时前
🚙 一条腿走路会摔:ES 关键词检索、混合召回与 ReRank 裁判
前端·javascript
YIAN3 小时前
从跨域代理到 WebSocket:梳理前端实时通信的底层逻辑与完整实践
前端·websocket
一曲终散3 小时前
创建 SVG 图标预览页面:从零实现到解决 CORS 问题
前端
静默回滚3 小时前
iPhone照片电脑上打不开:HEIC解码从原理到WASM
前端