Reputation: 649
I want to show more info onclick, but I have different divs to show/hide . So. I do it this way : The state is :
this.state = {
showMore: false,
showRewards: false,
fees: false,
showFees: false
};
One of the divs:
<div className='some'> <h3 >Rewards <i className="icon-im-rewards"></i></h3> <h5 className="showMoreDetails" onClick={ () => this.show('rewards') }>{ showRewards ? '-' : '+' } { showRewards ? 'Show Less' : 'Show More' }</h5> { showRewards && detail.rewards.reward.map((name, i) => <p key={i}> { name }</p> ) } </div>
The function :
show (name) { let { showMore, showRewards, showFees } = this.state;
if (name === 'hightlights' && showMore === false) {
this.setState({
showMore: true
});
} else {
this.setState({
showMore: false
});
}
if (name === 'rewards' && showRewards === false) {
this.setState({
showRewards: true
});
} else {
this.setState({
showRewards: false
});
}
if (name === 'fees' && showFees === false) {
this.setState({
showFees: true
});
} else {
this.setState({
showFees: false
});
}
This is too long, ugly and doesn't work correct (I can only see one expanded div at a time) How to improve it?
Upvotes: 0
Views: 866
Reputation: 1975
It could be easier if you could show us the structure of detail & rewards. I guess you are mapping a single element here that's why it is printing single element. However, try changing this line,
detail.rewards.reward.map((name, i) => <p key={i}> { name }</p> )
replace with below code:
detail.rewards.map((reward, i) => <p key={i}> { reward.name }</p> )
Upvotes: 0
Reputation: 10304
This is a better and a cleaner way:
function show (name) {
let { showMore, showRewards, showFees } = this.state;
showMore = name === 'hightlights' && showMore === false;
showRewards = name === 'rewards' && showRewards === false;
showFees = name === 'fees' && showFees === false;
this.setState({
showFees,
showRewards,
showMore
});
Upvotes: 2