列表状态“颜色提示”组件

 contant.ts

type List<T> = Array<{
    code: T;
    label: string;
}>;
const parseListToMap = <T>(list: List<keyof T>): Record<keyof T, string> => {
    const result: Record<keyof T, string> = Object.create(null);
    list.forEach((item) => (result[item.code] = item.label));
    return result;
};
// 公共状态
export enum pubilcStatus {
    GONGKAI = 'GONGKAI',
    GEREN = 'GEREN',
    BAOMI = 'BAOMI',
}
export const pubilcStatusList: List<pubilcStatus> = [
    {
        code : pubilcStatus.BAOMI,
        label: '保密',
    },
    {
        code : pubilcStatus.BAOMI,
        label: '个人',
    },
    {
        code : pubilcStatus.GONGKAI,
        label: '公开',
    }
];
export const pubilcStatusMap = parseListToMap(pubilcStatusList);

index.tsx

import React ,{FC}from 'react'
import {pubilcStatus,pubilcStatusMap} from '@/constants'
import {Badge,BadgeProps} from 'antd'

interface PubilcStatusProps extends Omit<BadgeProps,'status'> {
    status: pubilcStatus,
    text?: string
}

const publicColorMap = {
    [pubilcStatus.GONGKAI]: 'green',
    [pubilcStatus.GEREN]: 'red',
    [pubilcStatus.BAOMI]: 'block'
};

const PubilcGroupStatus: FC<PubilcStatusProps> = ({status,text,...props}) => {
    return <Badge color={publicColorMap[status]} text={text || pubilcStatusMap[status]} {...props}/>
}

export default PubilcGroupStatus;

type.d.ts

export interface PublicGroupRecord {
    publicGroupId: string;
    publicGroupName: string; 
    status: publicGroupStatus; 
    resultStrategy: publicGroupResultMode;
    riskType: string;
    remark: string; 
    creator: string; 
}

列表组件

const columns: ColumnsType<PublicGroupRecord> = [
    {
            dataIndex: 'status',
            key: 'status',
            title: '状态',
            width: '10%',
            render: (text: publicGroupStatus) => (
                <EllipsisPopover text={text ? <PublicGroupStatus status={text} /> : '-'} />
            ),
            ellipsis: true,
            filters: publicGroupStatusList.map((i) => ({value: i.code, text: i.label}))
        },
]

加载配合组件

/* eslint-disable @typescript-eslint/no-empty-function */
/* eslint-disable @typescript-eslint/no-unused-vars */
/* eslint-disable @typescript-eslint/prefer-for-of */

import {Popover} from 'antd';
import {FC, useRef, useState} from 'react';

interface PopoverProps {
    text: string | React.ReactNode;
}

let currBubbleCallback = (state: boolean) => {};
let showCurrBubble = () => currBubbleCallback(true);
let hideCurrBubble = () => currBubbleCallback(false);

const EllipsisPopover: FC<PopoverProps> = ({text}) => {
    const [isVisible, setIsVisible] = useState(false);
    const spanRef = useRef<HTMLSpanElement>(null);
    const timeRef = useRef<any>(undefined); // timeoutID

    const renderBubble = (state: boolean) => {
        // 有上一个泡时
        if (timeRef.current !== undefined) {
            clearTimeout(timeRef.current);
            timeRef.current = undefined;
        }
        setIsVisible(state);
    };

    // 判断是否文字超出
    const hasEllipsis = (ele: HTMLSpanElement | null) => {
        return ele && ele.scrollWidth > ele.offsetWidth;
    };

    const handleMouseEnter = () => {
        // 现在的泡可以用上一个泡的renderBubble来隐藏上一个泡
        currBubbleCallback(false); // 隐藏上一个泡
        currBubbleCallback = renderBubble; // 把现在泡的renderBubble给下一个

        if (hasEllipsis(spanRef.current)) {
            setIsVisible(true);
        }
    };

    const handleMouseLeave = () => {
        const popDom = document.getElementsByClassName('ant-popover-inner-content');

        for (let i = 0; i < popDom.length; ++i) {
            const dom = popDom[i];
            // 给每个泡监听器
            if (dom.getAttribute('listener') !== 'true') {
                dom.addEventListener('mouseenter', showCurrBubble);
                dom.addEventListener('mouseleave', hideCurrBubble);
                dom.setAttribute('listener', 'true');
            }
        }

        timeRef.current = setTimeout(() => {
            renderBubble(false);
        }, 500);
    };

    return (
        <Popover content={text} visible={isVisible}>
            <span
                ref={spanRef}
                onMouseEnter={handleMouseEnter}
                onMouseLeave={handleMouseLeave}
                style={{
                    display: 'block',
                    overflow: 'hidden',
                    textOverflow: 'ellipsis'
                }}
            >
                {text}
            </span>
        </Popover>
    );
};

export default EllipsisPopover;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒枫落林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值