Обработчики событий — это действия или модели поведения, которые решают выполняться всякий раз, когда запускается событие.
В приложениях React имена событий пишутся верблюжьим регистром, что означаетonclick
быть записано какonClick
.
Реализовано Реактомсинтетическое событиеМеханизмы обеспечивают согласованность приложений и интерфейсов React, предлагая преимущества высокой производительности. Он обеспечивает согласованность за счет стандартизации событий, чтобы они имели одинаковые свойства в разных браузерах и платформах.
Синтетические события — это кросс-браузерные оболочки собственных событий браузера. Помимо совместимости со всеми браузерами, он также имеет тот же интерфейс, что и собственные события браузера, в том числеstopPropagation()
а такжеpreventDefault()
.
Высокая производительность синтетических событий достигается за счет автоматического использования прокси событий. На самом деле React не привязывает обработчики событий к самому узлу, а скорее привязывает прослушиватель событий к корневому элементу документа. Всякий раз, когда событие запускается, React сопоставляет прослушиватель событий с соответствующим элементом компонента.
прослушать событие
Прослушивание событий в React так же просто, как:
class ShowAlert extends React.Component {
showAlert() {
alert("Im an alert");
}
render() {
return <button onClick={this.showAlert}>show alert</button>;
}
}
В приведенном выше примереonClick
Свойство является нашим обработчиком событий, который добавляется к целевому элементу для выполнения функции, которая будет выполняться при щелчке элемента.onClick
свойство установленоshowAlert
функция.
Проще говоря, всякий раз, когда нажимается кнопка,showAlert
Функция вызывается и отображается сообщение.
метод привязки
В JavaScript методы класса не связаны по умолчанию. Поэтому важно привязывать функции к экземплярам классов.
существуетrender()
Граница
Этот подход находится вrender
вызов функцииbind
способ привязки:
class ChangeInput extends Component {
constructor(props) {
super(props);
this.state = {
name: ""
};
}
changeText(event) {
this.setState({
name: event.target.value
});
}
render() {
return (
<div>
<label htmlFor="name">Enter Text here </label>
<input type="text"
id="name"
onChange={this.changeText.bind(this)}
/>
<h3>{this.state.name}</h3>
</div>
);
}
}
В приведенном выше примере мы используемonChange
Обработчик событий прослушивает события клавиатуры в поле ввода, что выполняется путем привязки в функции рендеринга. Этот метод нужно вызывать в функции рендеринга.bind(this)
.
Зачем?
Метод любого класса ES6 является общей функцией JavaScript, так что всеFunctionпрототипное наследованиеbind()
метод. Теперь, когда мы вызываем внутри JSXonChange
час,this
будет указывать на экземпляр нашего компонента.
Использование этого подхода может вызвать некоторые потенциальные проблемы с производительностью, поскольку функция перераспределяется после каждого рендеринга. Это снижение производительности может быть незаметным в небольших приложениях React, но заметно в больших приложениях.
существуетconstructor()
связывание
Если способ привязки в рендере вам не подходит, вы также можетеconstructor()
Привязать. Примеры следующие:
class ChangeInput extends Component {
constructor(props) {
super(props);
this.state = {
name: ""
};
this.changeText = this.changeText.bind(this);
}
changeText(event) {
this.setState({
name: event.target.value
});
}
render() {
return (
<div>
<label htmlFor="name">Enter Text here </label>
<input type="text" id="name" onChange={this.changeText} />
<h3>{this.state.name}</h3>
</div>
);
}
}
Как вы видете,changeText
функция связана вconstructor
начальство:
this.changeText = this.changeText.bind(this)
слева от знака равенстваthis.changeText
направлениеchangeText
Метод, поскольку шаг работает в эксплуатацииconstructor
сделано, так чтоthis
направлениеChangeInput
компоненты.
справа от знака равенстваthis.changeText
указать на то жеchangeText
метод, но теперь мы вызываем его.bind()
метод.
в скобкахthis
как мы проходим в.bind()
Параметры в нем указывают на контекст (context), на который следует указатьChangeInput
компоненты.
Также стоит отметить, что еслиchangeText
Доступ к нему невозможен без привязки к экземпляру компонентаthis.setState
, потому что в это времяthis
будетundefined
.
Связывание со стрелочными функциями
Другой способ привязки обработчиков событий — использование стрелочных функций. С помощью этой функции класса ES7 (экспериментальнаясинтаксис полей открытого класса), мы можем привязывать события, когда метод определен, например:
class ChangeInput extends Component {
handleEvent = event => {
alert("I was clicked");
};
render() {
return (
<div>
<button onClick={this.handleEvent}>Click on me</button>
</div>
);
}
}
Синтаксис выражений стрелочных функций короче, чем у традиционных функциональных выражений, и не имеет собственногоthis
,arguments
,super
а такжеnew.target
.
В приведенном выше примере после создания компонентаthis.handleEvent
Изменений больше не будет. Этот метод очень прост и легко читается.
вместеrender
Как и в случае с методами, привязанными к функциям, этот подход имеет свою собственную стоимость производительности.
Используйте анонимную функцию стрелкиrender
связывание
Определите анонимную функцию (функцию стрелки) при привязке и привяжите анонимную функцию к элементу вместо прямой привязки обработчика событий, поэтомуthis
Не в анонимных функцияхundefined
сейчас:
class LoggingButton extends React.Component {
handleClick() {
console.log('this is:', this);
}
render() {
return (
<button onClick={(e) => this.handleClick(e)}>
Click me
</button>
);
}
}
С этим подходом каждый раз возникает проблемаLoggingButton
При рендеринге появляется новыйcallback
анонимная функция. В этом примере нет проблем, но если этоonClick
значение какprops
При передаче дочернему компоненту это приведет к перезагрузке дочернего компонента.render
, поэтому не рекомендуется.
Пользовательские компоненты и события
Когда дело доходит до событий в React, только элементы DOM могут иметь обработчики событий. Например, сейчас есть компонент под названиемCustomButton
, который имеетonClick
событие, но при нажатии ничего не происходит по причине, упомянутой выше.
Итак, как мы обрабатываем привязку событий в пользовательских компонентах?
Ответ черезCustomButton
Визуализируйте элемент DOM в компоненте и поместитеonClick
Передайте это в качестве реквизита,CustomButton
Компоненты — это всего лишь средство доставки для событий щелчка.
class CustomButton extends Component {
render() {
const { onPress, children } = this.props;
return (
<button type="button" onClick={onPress}>
{children}
</button>
);
}
}
class ChangeInput extends Component {
handleEvent = () => {
alert("I was clicked");
};
render() {
return (
<div>
<CustomButton onPress={this.handleEvent}>Click on me</CustomButton>
</div>
);
}
}
В этом примереCustomButton
Компонент получает вызовonPress
поддержите, а затем дайтеbutton
прошло вonClick
.
Передать параметры обработчикам событий
Обработчикам событий обычно передаются дополнительные параметры, напримерid
— идентификатор строки. Можно использовать следующие два способа передачи параметров:
<button onClick={(e)=>this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>
Вышеупомянутые два метода передачи параметров эквивалентны.
В двух методах передачи параметров параметрe
Оба представляют события React, которые будут переданы в качестве параметров.id
Второй параметр после его передачи. Отличие в том, что при использовании стрелочных функций параметрыe
Чтобы показать проход, но используйтеbind
Если объект события и другие параметры будут переданы неявно.