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'
    }
  ])
相关推荐
小码哥_常1 小时前
安卓黑科技:实现多平台商品详情页一键跳转APP
前端
killerbasd1 小时前
还是迷茫 5.3
前端·react.js·前端框架
不会敲代码12 小时前
TCP/IP 与前端性能:从数据包到首次渲染的底层逻辑
前端·tcp/ip
kyriewen2 小时前
奥特曼借GPT-5.5干杯,而你的Copilot正按Token收钱
前端·github·openai
AC赳赳老秦2 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
kyriewen2 小时前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
前端·javascript·设计模式
千寻girling3 小时前
《 Git 详细教程 》
前端·后端·面试
之歆4 小时前
DAY08_CSS浮动与行内块布局实战指南(下)
前端·css
yqcoder4 小时前
CSS Position 全解析:5 种定位模式详解
前端·css
Rhi6375 小时前
从零搭建项目:React 19 + Vite 8 + Tailwind CSS v4 实战配置
前端