有没有办法确定文本在使用行数时会被截断?已经到处找了,没有明确的答案。谢谢!
s2j5cfk01#
您可以使用numberOfLines作为<Text />组件的props。它取决于您的组件的宽度,然后计算文本的长度。此prop通常与ellipsizeMode一起使用。示例:
numberOfLines
<Text />
ellipsizeMode
<Text numberOfLines={2} ellipsizeMode='tail'> Lorem Ipsum is simply dummy text of the printing and typesetting industry.</Text>
<Text numberOfLines={2} ellipsizeMode='tail'>
Lorem Ipsum is simply dummy text of the printing and typesetting industry.
</Text>
字符串
nle07wnf2#
现在可以使用onTextLayout事件,其中包含一个正在渲染的lines数组。只需查看长度即可确定是否达到极限。lines数组中还有其他细节,如每行的实际高度和宽度,可以进一步用于确定文本是否被截断。
onTextLayout
lines
const NUM_OF_LINES = 5;const SOME_LONG_TEXT_BLOCK = 'Fill in some long text yourself ...';return (<Text numberOfLines={NUM_OF_LINES} onTextLayout={({ nativeEvent: { lines } }) => setState({ showMoreButton: lines.length === NUM_OF_LINES }) }> {SOME_LONG_TEXT_BLOCK}</Text>;
const NUM_OF_LINES = 5;
const SOME_LONG_TEXT_BLOCK = 'Fill in some long text yourself ...';
return (<Text
numberOfLines={NUM_OF_LINES}
onTextLayout={({ nativeEvent: { lines } }) =>
setState({ showMoreButton: lines.length === NUM_OF_LINES })
}
>
{SOME_LONG_TEXT_BLOCK}
</Text>;
gopyfrb33#
这对我来说很有效:)
import React, { useState } from 'react'import { Text } from 'react-native'export function MoreLessText({ children, numberOfLines }) { const [isTruncatedText, setIsTruncatedText] = useState(false) const [showMore, setShowMore] = useState(true) return isTruncatedText ? ( <> <Text numberOfLines={showMore ? numberOfLines : 0}>{children}</Text> <Text onPress={() => setShowMore(!showMore)}> {showMore ? 'Read More' : 'Less'} </Text> </> ) : ( <Text onTextLayout={(event) => { const { lines } = event.nativeEvent setIsTruncatedText(lines?.length > numberOfLines) }} > {children} </Text> )}
import React, { useState } from 'react'
import { Text } from 'react-native'
export function MoreLessText({ children, numberOfLines }) {
const [isTruncatedText, setIsTruncatedText] = useState(false)
const [showMore, setShowMore] = useState(true)
return isTruncatedText ? (
<>
<Text numberOfLines={showMore ? numberOfLines : 0}>{children}</Text>
<Text onPress={() => setShowMore(!showMore)}>
{showMore ? 'Read More' : 'Less'}
</>
) : (
<Text
onTextLayout={(event) => {
const { lines } = event.nativeEvent
setIsTruncatedText(lines?.length > numberOfLines)
}}
{children}
)
dffbzjpn4#
为了创建一个Instagram风格的评论,我这样做了(注意,我使用tailwind进行样式化,因为这是一个react原生应用程序,库是nativewind,我还使用了一个嵌套的文本,它允许我做一个web html <span>元素):
nativewind
<span>
const [more, setMore] = useState(false)const toggleShowMore = () => { setMore(!more)}<View className=" pl-1 pt-1 flex-row flex-1 max-w-[82%]"> <Text numberOfLines={!more ? 3 : undefined}> <Text onPress={() => navigateUser(comment.user.username)} className="font-bold"> @{comment.user?.username}{' '} </Text>{' '} <Text onPress={toggleShowMore}>{comment.content}</Text> </Text> </View>
const [more, setMore] = useState(false)
const toggleShowMore = () => {
setMore(!more)
<View className=" pl-1 pt-1 flex-row flex-1 max-w-[82%]">
<Text numberOfLines={!more ? 3 : undefined}>
<Text onPress={() => navigateUser(comment.user.username)} className="font-bold">
@{comment.user?.username}{' '}
</Text>{' '}
<Text onPress={toggleShowMore}>{comment.content}</Text>
</View>
4条答案
按热度按时间s2j5cfk01#
您可以使用
numberOfLines
作为<Text />
组件的props。它取决于您的组件的宽度,然后计算文本的长度。此prop通常与ellipsizeMode
一起使用。示例:字符串
nle07wnf2#
现在可以使用
onTextLayout
事件,其中包含一个正在渲染的lines
数组。只需查看长度即可确定是否达到极限。lines
数组中还有其他细节,如每行的实际高度和宽度,可以进一步用于确定文本是否被截断。字符串
gopyfrb33#
这对我来说很有效:)
字符串
dffbzjpn4#
为了创建一个Instagram风格的评论,我这样做了(注意,我使用tailwind进行样式化,因为这是一个react原生应用程序,库是
nativewind
,我还使用了一个嵌套的文本,它允许我做一个web html<span>
元素):字符串