问题
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?
回答1:
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>
)
}
回答2:
You can simply use numberOfLines
, which is a <Text>
prop:
Used to truncate the text with an ellipsis after computing the text layout, including line wrapping, such that the total number of lines does not exceed this number.
And, obviously, an adequate logic handler to save in your state
which text is shown and which is truncated.
Let's see an example I've just created:
state = {
textShown: -1,
};
toggleNumberOfLines = index => {
this.setState({
textShown: this.state.textShown === index ? -1 : index,
});
};
render() {
return (
<View style={styles.container}>
<FlatList
data={[
{ key: 'a', description: longText },
{ key: 'b', description: longText },
{ key: 'c', description: longText },
]}
renderItem={({ item, index }) => (
<View style={styles.flatListCell}>
<Text
numberOfLines={this.state.textShown === index ? undefined : 3}
style={styles.description}>
{longText}
</Text>
<Text
onPress={() => this.toggleNumberOfLines(index)}
style={{ color: 'red' }}>
{this.state.textShown === index ? 'read less...' : 'read more...'}
</Text>
</View>
)}
/>
</View>
);
}
Here I use state
to save the index of the element in the FlatList
which is shown. If none is shown, then the value saved is -1.
You can try its behavior in this snack, that (I hope) reproduces your case. Let me know if this is what you're looking for. (Hi, Anilkumar, we've already met :) )
回答3:
import React from 'react';
import PropTypes from 'prop-types';
import AnchorText from '../AnchorText';
import { StyledContainer, RegularText } from './styles';
export default class Description extends React.Component {
constructor(props) {
super(props);
this.state = {
showMore: true,
};
}
onClick = () => {
this.setState({
showMore: false,
});
};
render() {
const { description } = this.props;
const { showMore } = this.state;
if (!description) return null;
return (
<StyledContainer FD={'column'}>
{showMore ? (
<RegularText MT={1}>
{description.slice(0, 150)}{' '}
{description.length > 150 && (
<AnchorText onClick={this.onClick} label=" .. Read more" />
)}{' '}
</RegularText>
) : (
<RegularText MT={1}>{description}</RegularText>
)}
</StyledContainer>
);
}
}
Description.propTypes = {
description: PropTypes.string,
};
Check out this Widget
来源:https://stackoverflow.com/questions/55805233/how-to-show-for-text-more-less-in-react-naitve-javascript