Заметили ли вы, что вы принимаете параметр id
в вашем handleClick
, но не используете его?
Вы создаете массив компонента Popper
.Каждый из которых зависит от того же state.open
, чтобы открыться и того же state.anchorEl
, чтобы зависать.Поэтому, когда вы нажимаете на один маркер, все они появляются, и вы видите последний сверху.Каждый раз, когда последний остается сверху, он чувствует, что всплывет только один.
Что вы можете сделать, чтобы это исправить: Сделать anchorEl
, open
, placement
каждый массивом:
state = {
anchorEl: [],
open: [],
placement: [],
// ...
}
Теперь визуализируем Попперов на основе этого состояния и индекса события:
<Popper
id={index}
key={index}
open={open[index] || false} // use index to find out this one's open-closed state, defaults to false
anchorEl={anchorEl[index] || null} // use index to find out it's achor, defaults to null
placement={placement[index] || 'top'} // use index to find out it's placement, defaults to 'top'
transition
>
...
</Popper>
Также используйте id
, который вы отправляли на handleClick
:
handleClick = (placement, index) => event => { // i renamed the second param to index
const { currentTarget } = event
this.setState(state => ({
anchorEl: {
...state.anchorEl, // keep the anchorEl for other indices same
[index]: currentTarget, // only change this one
},
open: {
...state.open, // keep the other popper as they were
[index]: !state.open[index], // toggle only this one
},
placement: {
...state.placement, // keep the others same
[index]: placement, // update placement for this one
},
}))
}