- Использование разных значков - это всего лишь случай их импорта и использования вместо
ExpandMoreIcon
.Кроме того, мы отслеживаем состояние каждой отдельной панели (см. Пункт 2. ниже) и используем троичный, чтобы решить, какой значок отображать в зависимости от этого состояния.
<ExpansionPanelSummary
expandIcon={
this.state.expanded[statIndex]
? <Remove onClick={this.handleToggleOne(statIndex)} />
: <Add onClick={this.handleToggleOne(statIndex)} />
}
>
// panel contents
</ExpansionPanelSummary>
Мы отслеживаем отдельные состояния панели в массиве
expanded
в состоянии, и мы также отслеживаем «групповой» переключатель через
expandAll
логическое состояние.
expandAll
по умолчанию имеет значение false, а массив
expanded
инициализируется всеми ложными значениями (столько, сколько имеется панелей) при загрузке панелей.
Каждая сворачиваемая панель expanded
prop установлен в соответствующее значение expanded
массива в состоянии.Это определяет состояние панели (свернуто, если false, развернуто, если true).
Мы настроили два обработчика: handleToggleOne
каррируется с индексом панели и прикрепляется к значку раскрытия / свертывания для этой панели.,Он индивидуально устанавливает состояние панели в соответствии с указанным индексом.
handleToggleOne = (index) => () => {
const { expanded } = this.state
expanded[index] = !expanded[index]
this.setState({ expanded })
}
handleToggleAll
используется для одновременного открытия или закрытия всех панелей.Мы отслеживаем и переключаем значение expandAll
в состоянии и устанавливаем для каждого элемента в массиве expanded
это значение.Затем обработчик присоединяется к глобальному 'Toggle All' Button
.
handleToggleAll = () => {
this.setState(state => ({ expandAll: !state.expandAll, expanded: state.expanded.map(e => !state.expandAll) }))
}
. Вы можете найти рабочую ветвь вашего кода здесь: https://react -wd5uxp.stackblitz.io
(ссылка на редактор кода: https://stackblitz.com/edit/react-wd5uxp)