antd的tree组件:改成单选&同一层级只能展开一个(点击一个节点时另一个展开节点收起)

lxf2023-10-28 08:50:01

之前说的做做公司组织架构树的时候用到了tree组件,现在有两个改动:

  • tree节点可选择,但是antd提供的是多选,没有单选的,所以要把原组件改成单选。
  • 树展开的时候太长了,需要对树的展示高度进行限制。

tree组件有一个很好用的东西是onCheck、onExpend函数传入值里面有节点信息,这个信息很重要。 function(checkedKeys, e:{checked: bool, checkedNodes, node, event, halfCheckedKeys})

antd的tree组件:改成单选&同一层级只能展开一个(点击一个节点时另一个展开节点收起)

一、tree组件改成单选

这个其实并不难,虽然antd没有提供,但是可以自己进行改造。改造起来也很容易:

1、是把样式改了,因为传统的checkbox,方框都是表示多选,圆框是单选,其实就是加个border-radius样式

antd的tree组件:改成单选&同一层级只能展开一个(点击一个节点时另一个展开节点收起)

改造成↓

antd的tree组件:改成单选&同一层级只能展开一个(点击一个节点时另一个展开节点收起)

代码

.checkbox {
  margin-left: 20px;
  :global {
    .ant-tree-checkbox-inner {
      border-radius: 50% !important;
    }
  }
}

二是通过逻辑实现单选,一行代码搞定,用点击的节点的key直接替代掉原来的checkedkey数组。

onCheck={(_, e) => {
     setCheckedKeys([e.node.key]);
}}

二、限制树高

有两种办法:

  1. tree的层级是公司-事业处-部门-子部门。同一个部门只能展开一个,也就是有一个展开的时候,点另外一个节点时,原结点收起,现点击的结点展开。
  2. 对容纳tree的容器进行高度限制,tree高度超过容器时,展示滚动条。

第一种 antd的tree组件:改成单选&同一层级只能展开一个(点击一个节点时另一个展开节点收起)

第二种antd的tree组件:改成单选&同一层级只能展开一个(点击一个节点时另一个展开节点收起)

第二种办法很简单 加个样式即可style={{ height: 200, overflow: 'auto ' }}

第一种代码如下,有e.node.pos、e.expanded的信息就非常好写:

       const keyLevelMap = useRef(new Map()); //记录每一个展开节点的level
       
     //同时只展开一个部门/事业处/公司
            onExpand={(key, e) => {
              console.log(e);
              //e.node.pos第一层0-0,第二层0-0-0,第三层0-0-0-0……
              //e.expanded展开/收起 我记录旧值的样子好像小丑……
              if (e.expanded) {
                const level: number = e.node.pos.split('-').length - 1;
                keyLevelMap.current.set(e.node.key, level); //位置
                const filterKey: Key[] = [];
                key.map((item) => {
                  if (keyLevelMap.current.get(item) != level) {
                    filterKey.push(item);
                  }
                });
                filterKey.push(e.node.key); //加上自身
                setExpandKeys(filterKey);
              } else {
                setExpandKeys(key);
              }
            }}

最开始我不知道有传入的e记录了节点的展开、层级等,然后我就在死做,记录展开的旧值,和新值做对比,得出展开还是收起,以及展开的节点,然后再写些逻辑。

我们第一层的key是c0、c1,第二层的key是c0-m0,c0-m1,第三层部门的key是number类型的id(类似23、29这样的)…我就按照这个规律死做,最后意识到部门底下还有层级 还有子部门,这样写完全不行emmm…没有规律,因为部门和子部门都是number类型id毫无规律,不好控制,其实有上述那么简单的做法,我自己瞎搞这么复杂。

我一开始还觉得treeNode给的api太少了,给我一个字段加层级多好,想不到官方已经做好了层级的记录- -

antd的tree组件:改成单选&同一层级只能展开一个(点击一个节点时另一个展开节点收起)

(在犯蠢= =ifelse工程师) antd的tree组件:改成单选&同一层级只能展开一个(点击一个节点时另一个展开节点收起)

总结下来还是要仔细的看文档,灵活应用,害= =白白浪费时间写错误的做法,记录下来,以后不走弯路。

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!