I am developing react-native application. In that, We are showing some description on Text, It may be number of lines.
So, If data has more than 3 lines, I have to show More and Less if it's expanded.
<FlatList
style={styles.faltList}
showsVerticalScrollIndicator
data={data}
extraData={this.state}
renderItem={({ item, index }) => (
<View style={styles.flatListCell}>
<Text style={styles.description}>{item.description}</Text>
</View>
</View>
)
}
ItemSeparatorComponent={() => (
<View style={{ height: 10}} />
)}
/>
I have found react-native-view-more-text library, But I would like to implement it by custom code.
Note: I am displaying that Text in FlatList.
Any suggestions?
I tried in this way, Hope it helps to you and others!
const postTextContent = (props) => {
const [textShown, setTextShown] = useState(false); //To show ur remaining Text
const [lengthMore,setLengthMore] = useState(false); //to show the "Read more & Less Line"
const toggleNumberOfLines = () => { //To toggle the show text or hide it
setTextShown(!textShown);
}
const onTextLayout = useCallback(e =>{
setLengthMore(e.nativeEvent.lines.length >=4); //to check the text is more than 4 lines or not
// console.log(e.nativeEvent);
},[]);
return (
<View style={styles.mainContainer}>
<Text
onTextLayout={onTextLayout}
numberOfLines={textShown ? undefined : 4}
style={{ lineHeight: 21 }}>{Your Long Text}</Text>
{
lengthMore ? <Text
onPress={toggleNumberOfLines}
style={{ lineHeight: 21, marginTop: 10 }}>{textShown ? 'Read less...' : 'Read more...'}</Text>
:null
}
</View>
)
}
The first implementation is close but the problem is that the Read More button shows when the text equals 3 lines which it should not because there is no more text. I fixed it by updating the number of lines in state as well as checking if the text had been shown or not.
const ReadMoreText = ({ readMoreStyle, text, textStyle }) => {
const [showMoreButton, setShowMoreButton] = useState(false);
const [textShown, setTextShown] = useState(false);
const [numLines, setNumLines] = useState(undefined);
const toggleTextShown = () => {
setTextShown(!textShown);
};
useEffect(() => {
setNumLines(textShown ? undefined : 3);
}, [textShown]);
const onTextLayout = useCallback(
(e) => {
if (e.nativeEvent.lines.length > 3 && !textShown) {
setShowMoreButton(true);
setNumLines(3);
}
},
[textShown],
);
return (
<>
<Text onTextLayout={onTextLayout} numberOfLines={numLines} style={textStyle} ellipsizeMode="tail">
{text}
</Text>
{showMoreButton ? (
<Text onPress={toggleTextShown} style={readMoreStyle}>
{textShown ? 'Read Less' : 'Read More'}
</Text>
) : null}
</>
);
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With