Вот базовый компонент. И у <ul>
и <li>
есть функции onClick. Я хочу, чтобы запускался только onClick <li>
, а не файл <ul>
. Как я могу этого добиться?
Я играл с e.preventDefault (), e.stopPropagation (), но безрезультатно.
class List extends React.Component {
constructor(props) {
super(props);
}
handleClick() {
// do something
}
render() {
return (
<ul
onClick={(e) => {
console.log('parent');
this.handleClick();
}}
>
<li
onClick={(e) => {
console.log('child');
// prevent default? prevent propagation?
this.handleClick();
}}
>
</li>
</ul>
)
}
}
// => parent
// => child
reactjs
onclick
event-propagation
dmwong2268
источник
источник
Ответы:
Я была такая же проблема. Я обнаружил, что stopPropagation действительно работает. Я бы разделил элемент списка на отдельный компонент, вот так:
источник
this.props.handleClick()
вListItem
компонентеthis.props.click
?<Link>
React использует делегирование событий с одним прослушивателем событий в документе для всплывающих событий, таких как «щелчок» в этом примере, что означает, что остановка распространения невозможна; реальное событие уже распространено к тому моменту, когда вы взаимодействуете с ним в React. stopPropagation в синтетическом событии React возможно, потому что React обрабатывает распространение синтетических событий внутри себя.
источник
document.addEventListener('click')
сочетании сonClick
По порядку событий DOM: ЗАХВАТ vs ЗАПУСК
Есть два этапа распространения событий. Это называется «захват» и «всплытие» .
Сначала происходит этап захвата, затем следует этап всплывания. Когда вы регистрируете событие с помощью обычного DOM api, события по умолчанию будут частью стадии восходящей цепочки, но это можно указать при создании события.
В React всплывающие события также используются по умолчанию.
Заглянем внутрь нашего обратного вызова handleClick (React):
Альтернатива, которую я здесь не видел
Если вы вызываете e.preventDefault () во всех своих событиях, вы можете проверить, было ли событие уже обработано, и предотвратить его повторную обработку:
Информацию о разнице между синтетическими и собственными событиями см. В документации React: https://reactjs.org/docs/events.html
источник
Это не на 100% идеал, но если это слишком сложно передать
props
детям -> моде для детей, или создатьContext.Provider
/Context.Consumer
только для этой цели), и вы имеете дело с другой библиотекой, у которой есть собственный обработчик, который она запускает перед вашим вы также можете попробовать:Насколько я понимаю, этот
event.persist
метод предотвращает немедленное попадание объекта обратно вSyntheticEvent
пул React . Так что из-за этогоevent
переданного в React фактически не существует к тому времени, когда вы его доберетесь! Это происходит с внуками из-за того, как React обрабатывает вещи внутренне, сначала проверяя родительскийSyntheticEvent
элемент на наличие обработчиков (особенно если у родителя был обратный вызов).Пока вы не вызываете
persist
что-то, что могло бы создать значительную память для создания таких событий, какonMouseMove
(и вы не создаете какую-то игру Cookie Clicker, такую как Cookies бабушки), все должно быть в полном порядке!Также обратите внимание: время от времени читая их GitHub, мы должны следить за будущими версиями React, поскольку они могут в конечном итоге решить некоторые проблемы с этим, поскольку они, похоже, собираются сделать складной код React в компиляторе / транспиляторе.
источник
У меня были проблемы с
event.stopPropagation()
работой. Если вы тоже это сделаете, попробуйте переместить его в верхнюю часть функции обработчика кликов, это было то, что мне нужно было сделать, чтобы остановить всплытие события. Пример функции:источник
Вы можете избежать всплытия событий, проверив цель события.
Например, если у вас есть ввод, вложенный в элемент div, где у вас есть обработчик для события щелчка, и вы не хотите его обрабатывать, при щелчке ввода вы можете просто перейти
event.target
в свой обработчик и проверить, должен ли обработчик выполняться на основе свойства цели.Например вы можете проверить
if (target.localName === "input") { return}
.Итак, это способ «избежать» выполнения обработчика
источник
Новый способ сделать это намного проще и сэкономит вам время! Просто передайте событие в исходный обработчик кликов и вызовите
preventDefault();
.источник