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 分钟前
React 底层原理 & 新特性
前端
用户61848240219512 分钟前
我受够了 Electron 的 IPC 样板代码,于是写了 electron-ipc-auto-import
前端
梦想的颜色17 分钟前
TypeScript 完全指南(中):函数、接口、类与高级类型
前端·typescript
鹏多多19 分钟前
OpenSpec+SDD规范驱动AI Agent开发项目实战指南
前端·vue.js·react.js
叶小树咯25 分钟前
React 为什么不能像 Vue 那样 state.count++
前端·react.js
ricardo197330 分钟前
防抖节流进阶 + requestAnimationFrame:滚动与输入场景的性能优化
前端·面试
wjj不想说话30 分钟前
你项目里的 Pinia,可能已经成了第二个 localStorage
前端·vue.js
wuhen_n38 分钟前
LangChain JS 入门:快速搭建前端 AI 开发环境
前端·langchain·ai编程
天蓝色的鱼鱼1 小时前
画1万个图形就卡成PPT?试试这款国产高性能2D引擎
前端·javascript
云水一下1 小时前
JavaScript 从零基础到精通系列:异步编程与网络请求
前端·javascript