Я искал лучший способ предотвратить событие для элемента CHILD и событие триггера для элемента PARENT в компоненте реагирования.
Допустим, компонент имеет в своем состоянии массив объекта item иФункция ES6 map
отображает кнопку со значком для каждого элемента.Когда кнопка нажата, кнопка удаляется.
{this.state.items.map(item => (
<button ...>...</button>
))}
До сих пор я нашел 3 решения.
1 - event.stopPropagation (), основанный на id или каком-либо другом атрибуте,С ( Как ТОЛЬКО вызвать событие родительского щелчка при нажатии дочернего элемента )
<button id='parent' onClick={removeItem}>
<i id='child' className='fas fa-times-circle'></i>
</button>
removeItem(event) {
const target = event.target;
const id = target.id;
event.stopPropagation();
event.preventDefault();
if(event.target === 'parent') {
this.setState({
items: this.state.items.map(item => item.id != id)
});
}
}
2 - передать параметры в обработчик события вместо самого события
<button onClick={() => removeItem(item.id)}>
<i className='fas fa-times-circle'></i>
</button>
removeItem(id) {
this.setState({
items: this.state.items.map(item => item.id != id)
});
}
Минусы: это неэффективно, потому что новая ссылка на обработчик событий воссоздается при каждом рендеринге.
3 - Повторите пользовательский атрибут для родительских и всех дочерних элементов
<button itemid={item.id} onClick={removeItem}>
<i itemid={item.id} className='fas fa-times-circle'></i>
</button>
removeItem(event) {
const id = event.target.getAttribute('itemid');
this.setState({
items: this.state.items.map(item => item.id != id)
});
}
Минусы: необходимо убедиться, чтовсе дочерние элементы в дереве DOM имеют itemid={item.id}
, что в данном случае сложно (представьте себе элементы svg, такие как polygon
).
Каков наилучший способ?Я видел, что pointer-events: none;
также может использоваться с некоторыми реализациями.