react antd TreeSelect实现自定义标签

javascript 复制代码
 <ProFormTreeSelect
                label="接收对象"
                name="receiverObjects"
                colProps={{ span: 16 }}
                labelCol={{
                  span: 6,
                }}
                wrapperCol={{
                  span: 18,
                }}
                rules={[{ required: true }]}
                fieldProps={{
                  showSearch: true,
                  multiple: true,
                  // autoClearSearchValue: true,
                  filterTreeNode: true,
                  treeCheckable: true,
                  treeDataSimpleMode: true,
                  treeNodeFilterProp: 'label',
                  tagRender: (props) => {
                    if (!props.value) return <></>;
                    const ReceiverType = props.value.split('_')[0];
                    let selectTreeData = groupTree;
                    switch (ReceiverType) {
                      case 'group': {
                        selectTreeData = groupTree;
                        break;
                      }
                      case 'user': {
                        selectTreeData = userTree;
                        break;
                      }
                      case 'location': {
                        selectTreeData = locationTree;
                        break;
                      }
                      default:
                        break;
                    }
                    const selectObj = getTreeLabel(selectTreeData, props.value);
                  
                    return (
                      <div className="ant-select-selection-overflow">
                        <div className="ant-select-selection-overflow-item">
                          <span className="ant-select-selection-item" title={selectObj?.label}>
                            <span className="ant-select-selection-item-content">
                              {selectObj?.label}
                            </span>
                            <span
                              className="ant-select-selection-item-remove"
                              onClick={() => {
                                props.onClose();
                              }}
                            >
                              <span className="anticon anticon-close">
                                <CloseOutlined />
                              </span>
                            </span>
                          </span>
                        </div>
                      </div>
                    );
                  },

                  dropdownRender: (originNode: ReactNode) => {
                    return (
                      <div>
                        <Tabs
                          type="line"
                          className="w-full pl-4"
                          activeKey={activeKey}
                          tabBarStyle={{ height: '32px', marginBottom: '4px' }}
                          onChange={(activeKey) => {
                            setActiveKey(activeKey);
                          }}
                          items={ReceiverType}
                        />
                        {originNode}
                      </div>
                    );
                  },
                  treeData: treeData,
                }}
              />

selectObj的值是:(单个选项)

tagRender:显示的是单个tag的数据

|------------------|-----------------------|
| 自定义 tag 内容,多选时生效 | (props) => ReactNode |

复制代码
  const getTreeLabel = (data: TreeProps, value: string) => {
    let result: TreeItemProps = {};
    let fn = function (data: TreeProps) {
      if (Array.isArray(data)) {
        for (let i = 0; i < data.length; i++) {
          const e = data[i];
          if (e.key === value) {
            result = e; // 返回的结果等于每一项
            break;
          } else if (e.children) {
            fn(e.children); // 递归调用下边的子项
          }
        }
      }
    };
    fn(data); // 调用一下
    return result;
  };
相关推荐
hh随便起个名4 小时前
力扣二叉树的三种遍历
javascript·数据结构·算法·leetcode
我是小路路呀5 小时前
element级联选择器:已选中一个二级节点,随后又点击了一个一级节点(仅浏览,未确认选择),此时下拉框失去焦点并关闭
javascript·vue.js·elementui
程序员爱钓鱼5 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
PineappleCoder5 小时前
工程化必备!SVG 雪碧图的最佳实践:ID 引用 + 缓存友好,无需手动算坐标
前端·性能优化
JIngJaneIL6 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
敲敲了个代码6 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
澄江静如练_6 小时前
列表渲染(v-for)
前端·javascript·vue.js
JustHappy7 小时前
「chrome extensions🛠️」我写了一个超级简单的浏览器插件Vue开发模板
前端·javascript·github
Loo国昌7 小时前
Vue 3 前端工程化:架构、核心原理与生产实践
前端·vue.js·架构