antd树形控件的二次封装

2023-11-8 1,176 11/8

emmmm,主要解决的是一些样式上的问题 ,使用泛型二次封装一下

复选框只能叶结点存在,这里需要自己写一下渲染逻辑,当然,树形结构,使用递归即可

import { ConfigProvider, TreeSelect, TreeSelectProps } from 'antd';
import { CaretDownOutlined } from '@easyv/react-icons';
import { Key } from 'react';


interface ReplaceTreeSelectProps<T extends object> extends TreeSelectProps {
  value?: string[] | string;
  treeCheckable?: boolean;
  className?: string;
  treeData?: T[];
  onChange?: (value: string[] | string) => void;
}

export function ReplaceTreeSelect<T extends { [key: string]: any }>({
  treeCheckable = true,
  value,
  className,
  onChange,
  treeData = [],
  treeDefaultExpandedKeys,
  ...props
}: ReplaceTreeSelectProps<T>) {
  function constructTreeNodes(data: ReplaceTreeSelectProps<T>['treeData'] = []) {
    return data.map(({ value, children, title }) => {
      if (children) {
        return (
          <TreeSelect.TreeNode
            key={value}
            value={value}
            title={title}
            selectable={false}
            checkable={false}
            disableCheckbox={false}
            className="bg-[#232630]">
            {constructTreeNodes(children)}
          </TreeSelect.TreeNode>
        );
      }
      return (
        <TreeSelect.TreeNode
          key={value}
          selectable
          checkable
          value={value}
          className="bg-[#232630]"
          title={title}
        />
      );
    });
  }

  return (
    <ConfigProvider
      theme={{
        components: {
          TreeSelect: {
            nodeSelectedBg: '#2e2f34',
            nodeHoverBg: '#2e2f34',
            colorPrimaryBorder: '#232630',
            titleHeight: 32,
          },
        },
      }}>
      <TreeSelect
        value={value}
        className={className}
        treeCheckable={treeCheckable}
        treeDefaultExpandedKeys={treeDefaultExpandedKeys ?? (value as Key[])}
        treeLine={{ showLeafIcon: <div /> }}
        switcherIcon={<CaretDownOutlined />}
        onChange={onChange}
        {...props}>
        {constructTreeNodes(treeData)}
      </TreeSelect>
    </ConfigProvider>
  );
}

 

使用自定义主题修改了treeSlect的一些默认样式

但是使用treeSelect的话会有一个问题 就是switcherIcon 他的大小是固定的 ,这里想隐藏叶子节点的icon,但是他的空间依旧存在,因为它使用了div包了一层,固定了大小,这也是为什么他展开的间距会相等,

解决这个问题的话 需要去修改antd对应的默认样式

在全局样式文件 antd.less中进行样式覆盖,叶结点的类名为ant-select-tree-switcher-noop


.ant-select-tree-switcher-noop {
  display: none;
}
- THE END -
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论