Вы можете попробовать использовать curry , чтобы избежать встраивания обработчиков пунктов меню и сделать их более читабельными (и избежать возможных ошибок, связанных с синтаксисом, которые, как я полагаю, у вас есть).Вы можете определить обработчики следующим образом:
onEditFolder = folder => event => {
// edit click handler
}
onDeleteFolder = folder => event => {
// delete click handler
}
И затем использовать их в рендере (внутри цикла folders.map
) следующим образом:
<Menu onClose={this.handleFolderActionClose}>
<MenuItem onClick={this.onEditFolder(folder)}>
<ListItemIcon>
<Edit />
</ListItemIcon>
<ListItemText inset primary="Edit" />
</MenuItem>
<MenuItem onClick={this.onDeleteFolder(folder)}>
<ListItemIcon>
<Delete />
</ListItemIcon>
<ListItemText inset primary="Delete" />
</MenuItem>
</Menu>
Вы можете сделать это, потому что onEditFolder(folder)
возвращает функцию, которая ожидает событие согласно его определению.То же самое для onDeleteFolder(folder)
.
Примечание. Я добавил ключевое слово this
в качестве префикса для обеих функций, при условии, что они определены внутри того же компонента, где они используются.Если вы передаете их как реквизиты, измените их соответствующим образом.
FOLLOW-UP : ошибка не имеет ничего общего с отображением, но была вызвана тем, что оба меню полагались на одно и то же логическое значение для переключенияоткрывать или закрывать, вызывая отображение последнего меню независимо от того, какой элемент был нажат.
Я исправил это, создав массив menus
в состоянии с длиной, равной размеру списка и всем значениям.инициализируется false
(это делается в методе жизненного цикла componentDidMount
).Обработчики открытия и закрытия и закрытия меню были обновлены, чтобы передать индекс элемента списка, и обновили значение в массиве menus
до true
или false
, соответственно.Атрибут open
каждого компонента Menu
был установлен на соответствующую запись в массиве menus
, чтобы показать / скрыть меню на основе соответствующего значения.
Наконец, оба Menu
компоненты были одинаковыми id
, я тоже это исправил.
См. рабочую песочницу .