Вместо того, чтобы использовать одну переменную для хранения «израсходованного» значения в качестве логического значения, вы можете использовать объект с идентификатором каждой детали.
import React, { Component } from 'react';
import Collapse from '@material-ui/core/Collapse';
import Button from '@material-ui/core/Button';
class Collapsed extends Component {
constructor(props){
super(props);
this.state = {
expanded: {},
details: [
{
id: 0,
name: 'Tony Stark',
role: 'Iron Man'
},
{
id: 1,
name: 'Steve Rogers',
role: 'Captain America',
},
{
id: 2,
name: 'Thor',
role: 'God of Thunder'
}
]
}
}
handleExpandClick = (id) => {
this.setState({ expanded: ...this.state.expanded, [id] : true });
};
render() {
const {details, expanded} = this.state;
return (
<div>
{details.map((detail)=>(
<div key={detail.id}>
{detail.name}
<Button
variant="contained"
disableRipple
onClick={()=>this.handleExpandClick(detail.id)}
aria-expanded={expanded}
aria-label="Show more"
>
Role
</Button>
<Collapse in={expanded[detail.id]} timeout="auto" unmountOnExit>
{detail.role}
</Collapse>
</div>
))}
</div>
)
}
}
export default Collapsed
Если вы хотите иметь возможность закрыть израсходованное значениеподробно вы можете использовать функцию ручки, как:
handleExpandClick = (id) => {
let expended = this.state.expended;
expended = expended.hasOwnProperty(id) ? !expended[id] : true
this.setState({ expended });
}