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'
    }
  ])
相关推荐
cwj&xyp28 分钟前
Python(二)str、list、tuple、dict、set
前端·python·算法
dlnu201525062230 分钟前
ssr实现方案
前端·javascript·ssr
古木201934 分钟前
前端面试宝典
前端·面试·职场和发展
轻口味2 小时前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王3 小时前
React Hooks
前端·javascript·react.js
迷途小码农零零发3 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
娃哈哈哈哈呀3 小时前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js
旭东怪4 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
ekskef_sef5 小时前
32岁前端干了8年,是继续做前端开发,还是转其它工作
前端