event.target
дает элемент li
, поскольку браузер работает с DOM, а не с виртуальной структурой, которую React хранит в памяти.
На отображаемой странице нет элемента MenuItem
.Вместо этого есть элементов, которые визуализируются с помощью MenuItem
s.
События Click происходят от реальных элементов DOM, таких как div, input, li.Почему не из MenuItem?Потому что на странице нет <MenuItem>
.Когда вы нажимаете на элементы, вы нажимаете <li>
с, а не <MenuItem>
с.
То, что вы хотите сделать, достижимо путем установки «воображаемого» обработчика щелчков на виртуальном <MenuItem>
:
<VirtualElement onClick={virtualClickHandler} />
Затем при рендеринге реального DOM-элемента <li>
VirtualElement установит для него обработчик клика real :
class VirtualElement {
realClickHandler (e) { // Let's assume you've bound this in the constructor
// do stuff with "e" and "this.props"
}
render () {
return <li onClick={realClickHandler} />
}
}
Теперь область действия realClickHandler
содержит this
и e
.Это означает, что он может читать как состояние, так и (виртуальные) реквизиты объекта VirtualElements и , , события .
Заключительная часть - осталось толькоvirtualClickHandler
.Где это находится?В this.props
.Потому что, когда ранее вы говорили <VirtualElement onClick={virtualClickHandler} />
, этот обработчик onClick записывается на объекте props
VirtualElement.
Что вы хотите сделать, это вызвать virtualClickHandler из realClickHandler , который видит как событие , так и this объект:
realClickHandler (e) {
// Here you can tell the virtualClickHandler whatever it needs to know:
this.props.onClick({
event: e,
key: this.props.key
});
}