Ваш пример не является рекурсивным, но, возможно, у вас есть свои причины.Итак, поскольку вы используете строки для проверки расширенного состояния панели, вы можете использовать метод, который принимает в качестве параметра строку следующей панели, что-то вроде этого:
handleButtonClick = nextPanelString => (event, expanded) => {
this.setState({
expanded: nextPanelString,
});
};
Затем в методе рендеринга:
<ExpansionPanel expanded={expanded === 'panel1'} onChange={this.handleChange('panel1')} className={classes.expansionRoot}>
<ExpansionPanelSummary expandIcon={<ExpandMoreIcon />} classes= {{ root: classes.expand, expandIcon: classes.expandMore}}>
<Typography className={classes.heading} >One </Typography>
</ExpansionPanelSummary>
<ExpansionPanelDetails className={classes.expansionDetails}>
Content
<Button onClick={this.handleButtonClick('panel2')} variant="outlined">Next</Button>
</ExpansionPanelDetails>
</ExpansionPanel>
вот рабочий пример Stackblitz: демонстрация stackblitz
Опять же, ваш пример не рекурсивный, я рекомендовал бы использовать цикл для этого, но если этого достаточно для вашеготак и должно быть :)