一个文本省略组件(支持行数)

index.tsx

import { Tooltip } from 'antd-v4';
import { useEffect, useMemo, useRef, useState } from 'react';
import classNames from 'classnames';
import styles from './index.module.less';

interface Props {
  text: string | string[];
  /**
   * 宽度, 默认为 100%,可自行设置
   */
  width?: number | string;
  style?: React.CSSProperties;
  className?: string;
  /**
   * 行数, 默认为 1
   */
  lineClamp?: number;
  /**
   * 无内容时的填充字符,默认为 '-'
   */
  emptyFill?: string;
  /**
   * 数组转字符串展示的连接符,默认为 '、'
   */
  jointMark?: string;
}

/**
 * 省略文本组件,支持单行和多行
 * @param param0
 * @returns
 */
const EllipsisText = ({
  text,
  width = '100%',
  style,
  className,
  lineClamp = 1,
  emptyFill = '-',
  jointMark = '、'
}: Props) => {
  const textRef = useRef<any>(null);
  const [isOverflow, setIsOverflow] = useState(false);

  const isSingleLine = useMemo(() => typeof lineClamp !== 'number' || lineClamp <= 1, [lineClamp]);

  useEffect(() => {
    const checkOverflow = () => {
      const element = textRef.current;
      if (isSingleLine) {
        setIsOverflow(element.scrollWidth > element.offsetWidth);
      } else {
        setIsOverflow(element.scrollHeight > element.clientHeight);
      }
    };

    checkOverflow();
    window.addEventListener('resize', checkOverflow);

    return () => {
      window.removeEventListener('resize', checkOverflow);
    };
  }, [isSingleLine]);

  const toolTipTitle = useMemo(() => {
    const _text =
      Array.isArray(text) && !!text?.length
        ? text?.map(t => <div className='tool-tip-title-col'>{t}</div>)
        : text || '';
    return isOverflow && _text ? _text : '';
  }, [isOverflow, text]);

  return (
    <Tooltip title={toolTipTitle}>
      <div
        ref={textRef}
        className={classNames(
          isSingleLine && styles.ellipsisTextComp,
          !isSingleLine && styles.multilineEllipsisTextComp,
          className
        )}
        style={{ width: width, WebkitLineClamp: lineClamp, ...(style || {}) }}
      >
        {Array.isArray(text) && !!text?.length ? text?.join(jointMark) : text || emptyFill}
      </div>
    </Tooltip>
  );
};

export default EllipsisText;

index.module.less

.ellipsisTextComp {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.multilineEllipsisTextComp {
  display: -webkit-box;
  overflow: hidden;
  text-overflow: ellipsis;
  -webkit-box-orient: vertical;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值