跳转到内容

Truncate

裁剪文本的基础组件,通常不需要直接使用它,本包提供的 <ShowMore /><MiddleTruncate /> 均基于本组件进行扩展。

用法

像普通的组件一样使用它,只需要将长文本作为 children prop 传递。

import React from 'react'
import { Truncate } from '@re-dev/react-truncate'
const MyComponent: React.FC = () => {
return (
<Truncate
lines={3}
ellipsis={
<span>
<a href="/link/to/article">Read more</a>
</span>
}
onTruncate={(didTruncate) => {
console.log(didTruncate)
}}
>
{longText}
</Truncate>
)
}

提示:(通常使用 React)如果你想保留纯文本中的换行符,你需要执行以下操作:

//...
{
text.split('\n').map((line, i, arr) => {
const line = <span key={i}>{line}</span>
if (i === arr.length - 1) {
return line
} else {
return [line, <br key={i + 'br'} />]
}
})
}
//...

类型声明

这是组件的 Props 类型。

import type React from 'react'
type DetailedHTMLProps = React.DetailedHTMLProps<
React.HTMLAttributes<HTMLSpanElement>,
HTMLSpanElement
>
export interface TruncateProps extends DetailedHTMLProps {
/**
* 待截断的原始文本内容,支持富文本
*/
children: React.ReactNode
/**
* 省略部分的符号
*
* @default ''
*/
ellipsis?: React.ReactNode
/**
* 限制当内容溢出时将被截断的行数
*
* 1. 如果不是安全整数,则默认为 `0`
* 2. 如果小于 `0` ,则默认为 `0`
* 3. 如果值为 `0` ,则表示不被截断
*
* @description 选项冲突注意事项:
* 当启用`middle`选项时,该选项将始终为 `1`
*
* @since v0.4.0 添加安全整数和正整数检查
*
* @default 1
*/
lines?: number
/**
* 如果为 `true` ,省略号之前的空格将被删除
* 例如: `words …` 将成为 `words…` 而不是
*
* @default false
*/
trimWhitespace?: boolean
/**
* 指定外部元素的宽度,
*
* 如果指定,则内容的计算将基于此数字。
*
* 不指定的情况下将根据组件的
* `parentElement.getBoundingClientRect().width` 获取
*/
width?: number
/**
* 用于分词的分隔符
*
* 默认情况下,假定文本使用空格作为分词约定(例如英语),
*
* 但是不一定适合全部语言,不同的语言可以根据用语习惯指定其他符号,
* 例如中文内容时,可传入空字符串,从而得到更好的计算结果。
*
* @since v0.2.0
*
* @default ' '
*/
separator?: string
/**
* 启用在中间位置截断
*
* @description 选项冲突注意事项:
* 当启用此选项时,`lines` 选项将始终为 `1`
*
* @since v0.3.0
*
* @default false
*/
middle?: boolean
/**
* 从文本末尾开始保留的字符数
*
* 始终通过 `Math.floor` 向下取整,并且不论正负数,都始终处理为相对于结尾的位置。
*
* 如果结束位置超出了文本长度时,截断位置会被处理在末尾。
*
* @description 选项生效注意事项:
* 该选项仅在 `middle` 选项启用时才会生效
*
* @since v0.3.0
*
* @default 5
*/
end?: number
/**
* 触发截断行为时的回调函数
*
* @param didTruncate - 是否发生截断
*
*/
onTruncate?: (didTruncate: boolean) => void
}